1. 程式人生 > >Python_生成器(下)之單線並行--生產著消費者模型

Python_生成器(下)之單線並行--生產著消費者模型

 1 import time
 2 def consumer(name):
 3     print('%s準備吃包子了!' %name)
 4     while True:
 5         baozi = yield
 6         print('[%s]包子來了,被[%s]吃了' %(baozi,name))
 7 
 8 def producer(name):
 9     c = consumer('胖虎')
10     c2 = consumer('狗子')
11     c.__next__()
12     c2.__next__()
13     print('我要做包子啦!狗子,胖虎
') 14 for i in a: 15 time.sleep(1) 16 print('%s做了2個包子'%name) 17 c.send(i) 18 c2.send(i) 19 a = ['韭菜餡','豬肉餡', '雞蛋餡','茴香餡'] 20 producer('Lee')

 

1、生成器中,next 和 send 有什麼區別呢?

next只是單純的呼叫yeild,程式跳轉到yeild,但是不會給yeild傳值。
send也是呼叫yeild,但是同時給yeild傳值

 

2、那麼看程式第11、12行,問題來了,此處為什麼必須要執行next?

過程分析:

消費者 '胖虎' 執行完之後執行一個next,如果不執行這個next,那麼
consumer(name)中什麼動作都沒有執行,只有使用next這個指令,才可以使程式執行到 baozi = yield 這個語句,
這樣才可以執行第三行語句,也就是列印第3行中print中的內容

原理分析:

c = consumer('胖虎') 這條語句只是將函式consumer(name)這個函式變成了一個生成器,而並不執行consumer(name)的內容,
因為此時consumer(name)不是函式,而是一個生成器
所以要想執行consumer(name)中的內容,只有使用next,才可以讓程式在consumer(name)中往下走