def consumer():
r = ''
while True:
n = yield r
if not n:
return
print('[CONSUMER] Consuming %s...' % n)
r = '200 ok'
def produce(c):
c.send(None)
n = 0
while n < 5:
n = n + 1
print('[PRODUCER] Porducing %s...' % n)
r = c.send(n)
print('[PRODUCER] Consumer return: %s' % r)
c.close()
c = consumer()
produce(c)
第一步:执行 c.send(None)
,启动生成器返回第一个值,n = yield r
,此时 r
为空,n
还未赋值,然后生成器暂停,等待下一次启动。
第二步:生成器返回空值后进入暂停,produce(c)
接着往下运行,进入While
循环,此时 n
为1
,所以打印:
[PRODUCER] Producing 1...
第三步:produce(c)
往下运行到 r = c.send(1)
,再次启动生成器,并传入了参数1
,而生成器从上次n
的赋值语句开始执行,n
被赋值为1
,n
存在,if
语句不执行,然后打印:
[CONSUMER] Consuming 1...
接着r
被赋值为'200 OK'
,然后又进入循环,执行n = yield r
,返回生成器的第二个值,'200 OK'
,然后生成器进入暂停,等待下一次启动。
第四步:生成器返回'200 OK'
进入暂停后,produce(c)
往下运行,进入r
的赋值语句,r
被赋值为'200 OK'
,接着往下运行,打印:
[PRODUCER] Consumer return: 200 OK
以此类推...
当n
为5
跳出循环后,使用c.close()
结束生成器的生命周期,然后程序运行结束。
来源:廖雪峰Python教程源码及评论(记录学习用)