Python语言---生成器函数并发

import time
def consumer(name):
    print(name,'开始吃包子啦!')
    while True:
        food = yield #出入口
        print(name,'吃了',food,end='')

def producer():
    c1 = consumer('刘玄')
    c2 = consumer('刘处玄')
    c1.__next__()
    c2.__next__()
    for i in range(5):
        time.sleep(1)
        c1.send('肉包')
        print(i+1,'个')
        c2.send('菜包')
        print(i + 1, '个')
producer()
执行结果:
刘玄 开始吃包子啦!
刘处玄 开始吃包子啦!
刘玄 吃了 肉包1 个
刘处玄 吃了 菜包1 个
刘玄 吃了 肉包2 个
刘处玄 吃了 菜包2 个
刘玄 吃了 肉包3 个
刘处玄 吃了 菜包3 个
刘玄 吃了 肉包4 个
刘处玄 吃了 菜包4 个
刘玄 吃了 肉包5 个
刘处玄 吃了 菜包5 个

以上代码:实现了两个函数并发执行。即一个函数consumer负责吃包子,一个producer函数负责制作包子。当制作出包子
就把包子派送给consumer,consumer接受到包子就开始执行吃。所以制作包子+吃包子是交替进行的。这样给了我们一个
印象,感觉制作包子和吃包子两个函数都在执行。下面,你可以阅读基本原理



可以这样理解之所以执行 c1.__next__() 是因为要执行consumer函数,使得它从yield这个出入口出来,出来是
为了让其他函数传值到consumer函数的yield里面,当传值完成后,再次进入到consumer函数,
取出yield里面的值,供consumer函数之后的代码用,因为这里是while不断循环的,所以遇到有
yield时又会出去,直到有其他函数执行了c1.send***)才再次进入consumer函数

可能大家不明白,为什么要执行下面的代码:

c1.__next__()

可能大家会想:

c1.send('肉包')

这句代码已经说明派送包子已经知道要派送给谁,执行c1.__next__()有什么意义呢。

执行这句话的目的,可以理解虽然生产者producer知道做好的包子派送给谁,但是它并不知道这位顾客有没有需求,也就是顾客先有需求,生产者再有供给。当这句话执行后,激活了消费者consumer函数,然后消费者提出了需求,也就是执行到yield处,需要生产者往里面放包子,所以此时,消费者处于等待状态。此时,就会跳转到生产者函数里面,生产者已经知道了顾客的需求,然后派送(send()函数)才能有效


其他的内容:
1.next()不能传递特定的值,只能传递None进去
2.send()可以传递yield表达式的值进去
3.对于普通的生成器,第一个next调用,相当于启动生成器,会从生成器函数的第一行代码开始
执行,直到第一次执行完yield语句(第4行)后,跳出生成器函数。
4.需要提醒的是,第一次调用时,请使用next()语句或是send(None),不能使用send发送一个
None的值,否则会出错的,因为没有Python yield语句来接收这个值。


猜你喜欢

转载自blog.csdn.net/tobe_numberone/article/details/80847361