廖雪峰教程中协程的代码如下:
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] Producing %s...' % n)
r = c.send(n)
print('[PRODUCER] Consumer return: %s' % r)
c.close()
c = consumer()
produce(c)
c.send(None)
consumer()
执行到 yield r
,但是没有对n
赋值,属于启动生成器的操作。
当 c.send(1)
时,再将 send
的参数传递给n:1
。不管 send()
传入 None
还是其他值,都是碰到 yield
立即返回;如果不是启动生成器send(None)
,则先完成左值赋值(即启动生成器返回后的下一条语句),然后继续运行,直到再次碰到 yield