1. 程式人生 > 實用技巧 >生產者消費者模型

生產者消費者模型

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]吃掉了