python——生产者消费者模型

1.yield:   (1) yield 3 相当于return,控制的是函数的返回值

      (2)x = yield 的另一个特性,接受send传过来的值赋值给x

       举例说明

def test():
    print('开始了')
    first = yield                yield没有返回值,因此运行结果为None
    print('第二次调用',first)
    yield 2
    yield3

t = test()
res = t.__next__()
print(res)
res = t.send('函数停留在first那个位置,我就是给first赋值的')    
print(res)
运行结果:
开始了
None
第二次调用 函数停留在first那个位置,我就是给first赋值的
2

      send()函数的作用是进行下一次迭代(触发迭代器运行),并传入一个值,赋值给yield,此yield为函数停留处的yield,如果不传入一个值会报错

      总结:触发迭代器运行的方法至此有三种 t = test()

          (1)print(t.__next__)

          (2)print(next(t))

          (3)print(t.send(x))

生产者消费者模型:  实现了从A程序跳到B程序,通过while循环语句、yield 以及 send函数实现

import time
def consumer(name):
    print('我是[%s],我开始吃包子了'%name)
    while True:
        baozi = yield
        time.sleep(1)
        print('%s很开心的把[%s]吃掉了'%(name,baozi))
        

def producer():
    c1 = consumer('wupeiqi')      调用程序后运行到这一步,c1、c2可以理解为变为迭代器(调用了迭代器函数),(并不会运行函数内的语句)
    c2 = consumer('yuanhao')
    c1.__next__()             此时c1、c2触发迭代(),开始运行函数内的语句,即print(‘我是[%s],我开始吃包子了’%name),然后进入while循环到 yield停止
    c2.__next__()
    for i in range(10):
        time.sleep(1)
        c1.send('包子 %s' %i)      此时调用send函数,给yield传入一个值,同时通过baozi = yield将值传给了baozi,并触发迭代,执行第二个print,
        c2.send('包子 %s' %i)      此时仍在while死循环中,到yield停止,
                       程序运行到最后,其实是停在了yield处
producer()
运行结果:
我是[wupeiqi],我开始吃包子了
我是[yuanhao],我开始吃包子了
wupeiqi很开心的把[包子 0]吃掉了
yuanhao很开心的把[包子 0]吃掉了
wupeiqi很开心的把[包子 1]吃掉了
yuanhao很开心的把[包子 1]吃掉了
wupeiqi很开心的把[包子 2]吃掉了
yuanhao很开心的把[包子 2]吃掉了
wupeiqi很开心的把[包子 3]吃掉了
yuanhao很开心的把[包子 3]吃掉了
wupeiqi很开心的把[包子 4]吃掉了
yuanhao很开心的把[包子 4]吃掉了
wupeiqi很开心的把[包子 5]吃掉了
yuanhao很开心的把[包子 5]吃掉了
wupeiqi很开心的把[包子 6]吃掉了
yuanhao很开心的把[包子 6]吃掉了
wupeiqi很开心的把[包子 7]吃掉了
yuanhao很开心的把[包子 7]吃掉了
wupeiqi很开心的把[包子 8]吃掉了
yuanhao很开心的把[包子 8]吃掉了
wupeiqi很开心的把[包子 9]吃掉了
yuanhao很开心的把[包子 9]吃掉了

      

原文地址:https://www.cnblogs.com/jgua/p/13519121.html