关于yield创建协程的理解

时间:2021-10-30 19:32:41

先上利于理解的代码:

 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这两个关键点,在两个任务间跳转执行,并且会捎带上一些信息。