生產者消費者模型
阿新 • • 發佈:2020-08-17
1.yield: (1) yield 3 相當於return,控制的是函式的返回值
(2)x = yield 的另一個特性,接受send傳過來的值賦值給x
舉例說明
def test(): print('開始了') first = yield yield沒有返回值,因此執行結果為None print('第二次呼叫',first) yield 2 yield3 t = test() res = t.__next__() print(res) res = t.send('函式停留在first那個位置,我就是給first賦值的') print(res) 執行結果: 開始了 None 第二次呼叫 函式停留在first那個位置,我就是給first賦值的 2
send()函式的作用是進行下一次迭代(觸發迭代器執行),並傳入一個值,賦值給yield,此yield為函式停留處的yield,如果不傳入一個值會報錯
總結:觸發迭代器執行的方法至此有三種 t = test()
(1)print(t.__next__)
(2)print(next(t))
(3)print(t.send(x))
生產者消費者模型: 實現了從A程式跳到B程式,通過while迴圈語句、yield 以及 send函式實現
import time def consumer(name): print('我是[%s],我開始吃包子了'%name) while True: baozi = yield time.sleep(1) print('%s很開心的把[%s]吃掉了'%(name,baozi)) def producer(): c1 = consumer('wupeiqi') 呼叫程式後執行到這一步,c1、c2可以理解為變為迭代器(呼叫了迭代器函式),(並不會執行函式內的語句) c2 = consumer('yuanhao') c1.__next__() 此時c1、c2觸發迭代(),開始執行函式內的語句,即print(‘我是[%s],我開始吃包子了’%name),然後進入while迴圈到 yield停止 c2.__next__() for i in range(10): time.sleep(1) c1.send('包子 %s' %i) 此時呼叫send函式,給yield傳入一個值,同時通過baozi = yield將值傳給了baozi,並觸發迭代,執行第二個print, c2.send('包子 %s' %i) 此時仍在while死迴圈中,到yield停止, 程式執行到最後,其實是停在了yield處 producer() 執行結果: 我是[wupeiqi],我開始吃包子了 我是[yuanhao],我開始吃包子了 wupeiqi很開心的把[包子 0]吃掉了 yuanhao很開心的把[包子 0]吃掉了 wupeiqi很開心的把[包子 1]吃掉了 yuanhao很開心的把[包子 1]吃掉了 wupeiqi很開心的把[包子 2]吃掉了 yuanhao很開心的把[包子 2]吃掉了 wupeiqi很開心的把[包子 3]吃掉了 yuanhao很開心的把[包子 3]吃掉了 wupeiqi很開心的把[包子 4]吃掉了 yuanhao很開心的把[包子 4]吃掉了 wupeiqi很開心的把[包子 5]吃掉了 yuanhao很開心的把[包子 5]吃掉了 wupeiqi很開心的把[包子 6]吃掉了 yuanhao很開心的把[包子 6]吃掉了 wupeiqi很開心的把[包子 7]吃掉了 yuanhao很開心的把[包子 7]吃掉了 wupeiqi很開心的把[包子 8]吃掉了 yuanhao很開心的把[包子 8]吃掉了 wupeiqi很開心的把[包子 9]吃掉了 yuanhao很開心的把[包子 9]吃掉了