Python-yield模拟生产消费者模型

来源:互联网 发布:淘宝开店运营流程图 编辑:程序博客网 时间:2024/06/18 10:24


import timedef consumer(name):    print("%s 准备吃包子啦!" %name)    while True:       baozi = yield       print("包子[%s]来了,被[%s]吃了!" %(baozi,name))def producer():    c = consumer('A')    c2 = consumer('B')    c.__next__()    c2.__next__()    print("老子开始准备做包子啦!")    for i in range(10):        time.sleep(1)        print("做了2个包子!")        c.send(i)        c2.send(i)producer()

OUTPUT:

A 准备吃包子啦!B 准备吃包子啦!老子开始准备做包子啦!做了2个包子!包子[0]来了,被[A]吃了!包子[0]来了,被[B]吃了!做了2个包子!包子[1]来了,被[A]吃了!包子[1]来了,被[B]吃了!做了2个包子!包子[2]来了,被[A]吃了!包子[2]来了,被[B]吃了!做了2个包子!包子[3]来了,被[A]吃了!包子[3]来了,被[B]吃了!做了2个包子!包子[4]来了,被[A]吃了!包子[4]来了,被[B]吃了!做了2个包子!包子[5]来了,被[A]吃了!包子[5]来了,被[B]吃了!做了2个包子!包子[6]来了,被[A]吃了!包子[6]来了,被[B]吃了!做了2个包子!包子[7]来了,被[A]吃了!包子[7]来了,被[B]吃了!做了2个包子!包子[8]来了,被[A]吃了!包子[8]来了,被[B]吃了!做了2个包子!包子[9]来了,被[A]吃了!包子[9]来了,被[B]吃了!

过程:

这两句不会执行print

c = consumer('A') #只是创建一个生成器,并不执行c2 = consumer('B')#只是创建一个生成器,并不执行
c.__next__()#开始执行print语句并yield None给baozi但是yield之后直接返回,所以没有打印"包子None来了"
c2.__next__()#开始执行print语句并yield None给baozi但是yield之后直接返回,所以没有打印"包子None来了"
print("老子开始准备做包子啦!")
...

一下这两句直接跳到上一次yield记录的断点一步,并执行下面的吃包子语句。

c.send(i)c2.send(i)

这样就通过yield实现了单线程并行运算(做包子+吃包子)的效果。


原创粉丝点击