zoukankan      html  css  js  c++  java
  • 通过生成器yield实现单线程的情况下实现并发运算效果(异步IO的雏形)

    一、协程:
    1、生成器只有在调用时才会生成相应的数据
    2、调用方式有 " str__next__.()   str.send() ",
    3、并且每调用一次就产生一个值调用到最后一个值后会报错
    4、报错可用try和except做异常处理
     
    注意:
    next:是直接调用yield,并不会传值。
    send:是调用并直接传值给yield。
     1 #!/usr/bin/env python
     2 # -*- coding:utf8 -*-
     3 # Author:Dong Ye
     4 
     5 
     6 '''
     7 定义两个模型:
     8 一个是生产包子的。(生成器)
     9 另一个是吃包子的。(迭代器)
    10 
    11 这段功能实现了异步IO的雏形,也是一个简单的协程处理方式。
    12 协程的特点:实际是串行方式分开执行的,但由于运行效果快,给人的感觉像是并行。
    13 因此,协程也叫作:单线程下的并行执行效果。
    14 协程是包含在线程里的一个单位,线程时进程的一个单位。
    15 例如:enginx在异步单线程下,比多线程要快好多倍,也就是这种效果。
    16 '''
    17 
    18 import time
    19 
    20 
    21 #吃包子的
    22 def consumer(name):
    23     print('%s 准备吃包子了!' % name)
    24     while True:
    25         baozi = yield
    26         print("包子[%s]来了。被[%s]吃了!" %(baozi,name))
    27 
    28 
    29 #生产包子的
    30 def producer(name):
    31     #先定义2个协程(消费者)#将函数变成生成器
    32     c1 = consumer('A')   #2个消费者
    33     c2 = consumer('B')   #相当于2个协程(进程,线程,协程)
    34     #开始调用生成器初始化(准备吃包子)
    35     c1.__next__()     #开始调用生成器,只有next的时候才会到yield进行下一个操作
    36     c2.__next__()
    37     print('老子开始吃包子拉!')
    38     #循环的次数,每次循环都会传值给生成器(产生什么样的包子)
    39     for i in range(10):
    40         time.sleep(1)
    41         print("做了一个包子,分2半,一人一半")
    42         c1.send(i) #包子的类型
    43         c2.send(i)
    44 
    45 
    46 producer("alex")
    47 
    48 
    49 
    50 '''
    51 #手动做包子:
    52 c = consumer("dy")
    53 c.__next__()
    54 #c.__next__()
    55 
    56 b1 = "韭菜馅"
    57 c.send(b1)     #调用+传值
    58 #c.__next__()  #只调用,不传值
    59 '''
    60 
    61 
    62 
    63 
    64 显示结果:
    65 A 准备吃包子了!
    66 B 准备吃包子了!
    67 老子开始吃包子拉!
    68 做了一个包子,分2半,一人一半  #任务1
    69 包子[0]来了。被[A]吃了!      #任务2
    70 包子[0]来了。被[B]吃了!      #任务3
    71 做了一个包子,分2半,一人一半
    72 包子[1]来了。被[A]吃了!
    73 包子[1]来了。被[B]吃了!
    74 做了一个包子,分2半,一人一半
    75 包子[2]来了。被[A]吃了!
    76 包子[2]来了。被[B]吃了!
    77 做了一个包子,分2半,一人一半
    78 包子[3]来了。被[A]吃了!
    79 包子[3]来了。被[B]吃了!
    80 做了一个包子,分2半,一人一半
    81 包子[4]来了。被[A]吃了!
    82 包子[4]来了。被[B]吃了!
    83 做了一个包子,分2半,一人一半
    84 包子[5]来了。被[A]吃了!
    85 包子[5]来了。被[B]吃了!
    86 做了一个包子,分2半,一人一半
    87 包子[6]来了。被[A]吃了!
    88 包子[6]来了。被[B]吃了!
    89 做了一个包子,分2半,一人一半
    90 包子[7]来了。被[A]吃了!
    91 包子[7]来了。被[B]吃了!
    92 做了一个包子,分2半,一人一半
    93 包子[8]来了。被[A]吃了!
    94 包子[8]来了。被[B]吃了!
    95 做了一个包子,分2半,一人一半
    96 包子[9]来了。被[A]吃了!
    97 包子[9]来了。被[B]吃了!
    协程的示例
  • 相关阅读:
    【接口平台】上报接口处理时间
    【性能测试】吞吐量上不去的问题
    vue层级选择器多选
    打家劫舍 II
    打家劫舍
    房屋染色 II
    距离顺序排列矩阵单元格
    根据身高重建队列
    将 x 减到 0 的最小操作数
    确定两个字符串是否接近
  • 原文地址:https://www.cnblogs.com/abobo/p/8110485.html
Copyright © 2011-2022 走看看