Python_生成器(下)之單線並行--生產著消費者模型
阿新 • • 發佈:2018-11-06
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)中往下走