这段时间太忙了,没时间更新博客。
今天把python捡起来,看了下 协程。记录一个一开始没太明白的点。
直接贴代码:
def consumer():
r = ''
j = 0
while True:
n = yield r # 3
j = j + 1
print('********j=%d' %j)
if not n:
return
print('[CONSUMER] Consuming %s...' % n)
r = '200 OK'
def produce(c):
c.send(None) # 1
print('------------')
n = 0
while n < 5:
n = n + 1
print('[PRODUCER] Producing %s...' % n)
r = c.send(n) # 2
print('[PRODUCER] Consumer return: %s' % r)
c.close()
if __name__ == "__main__":
c = consumer()
produce(c)
一开始没弄明白 #1 标记出的
c.send(None)
有什么意义。但拿掉这一句后程序会报出如下错误:
F:\python_projects\python_test>python new.py
------------
[PRODUCER] Producing 1...
Traceback (most recent call last):
File "new.py", line 26, in <module>
produce(c)
File "new.py", line 20, in produce
r = c.send(n) # 2
TypeError: can't send non-None value to a just-started generator
搜索一下才明白:
是因为协程还未激活(GEN_CREATED 状态)要调用next(c) 激活协程,也可以调用c.send(None)来激活