先上利于理解的代码:
1 #coding:utf-8 2 def consumer(): 3 c_r = '' 4 while 1: 5 m = yield c_r 6 if not m: 7 return 8 print("consumer {}".format(m)) 9 c_r = '200 ok' 10 def produce(c): 11 n = 0 12 next(c) 13 while n<5: 14 n+=1 15 print("produce {}".format(n)) 16 p_r = c.send(n) 17 print("consumer return {}".format(p_r)) 18 c.close() 19 c = consumer() 20 produce(c)
1. next(c)启动生成器(顺便一提next(c)等价于c.send(None))。
2. 在produce里遇到c.send(None)时,就去执行consumer的代码,在consumer里遇到yield时,就会跳到produce去执行,并且带上c_r的值,会赋予p_r。
3. 在循环中,下一次遇到c.send(n)时,又跳去执行consumer的代码,此时会将n的值带上,赋予m。
4. 其实质就是通过c.send()和yield这两个关键点,在两个任务间跳转执行,并且会捎带上一些信息。