生產者與消費者模型初探
阿新 • • 發佈:2019-02-27
bsp spa 加速 投進 range shu 演示 clas NPU
1.引例
def producer(): r = [] for i in range(50): r.append(‘包子%s‘ % i) return r product= producer() def comsummer(product): for index, baozi in enumerate(product): print(‘第%s個人,吃了%s‘ % (index, baozi)) return 0 eat = comsummer(product)
上述代碼有一個弊端就是,必須得等到生產者把所有的‘包子’都生產完,再交給消費者‘吃包子’。這樣浪費了內存,消費者只能等待生產者。
2.send()函數的功能
send()函數有著與__next__()方法一樣的功能,使生成器運行到第一個yield為止。send()的另一個功能是,能將括號內的值,傳送到生成器運行中斷的那個yield。也就是send()函數生成器運行到某一個yield中斷,然後可以將值傳給這個yield。
#.send()功能演示 def pro(): print(‘2018-19賽季最佳第一陣容‘) print(‘前鋒NO.1‘) xiao_shuai = yield ‘lebron james‘ print(‘前鋒NO.2‘) print(xiao_shuai) yield ‘pual george‘ pl = pro() print(pl.__next__()) re = pl.send(‘kevin durant‘) print(re) #運行結果: 2018-19賽季最佳第一陣容 前鋒NO.1 lebron james 前鋒NO.2 kevin durant pual george
3.生產者與消費者模型
當程序中出現明顯的兩類任務,一類任務是負責生產,另外一類任務是負責處理生產的數據的(如爬蟲),我們就可以利用該模型來處理。
import timedef consumer(name): print(‘我是%s,我要開始吃包子了‘ %name) while True: baozi = yield print(‘%s很開心地把%s吃掉了‘ %(name, baozi)) def producer(): c1 = consumer(‘lebron‘) c2 = consumer(‘durant‘) c1.__next__() c2.__next__() for i in range(5): c1.send(‘第%s個包子‘ %i) c2.send(‘第%s個餃子‘ %i) eat = producer() #運行結果: 我是lebron,我要開始吃包子了 我是durant,我要開始吃包子了 lebron很開心地把第0個包子吃掉了 durant很開心地把第0個餃子吃掉了 lebron很開心地把第1個包子吃掉了 durant很開心地把第1個餃子吃掉了 lebron很開心地把第2個包子吃掉了 durant很開心地把第2個餃子吃掉了 lebron很開心地把第3個包子吃掉了 durant很開心地把第3個餃子吃掉了 lebron很開心地把第4個包子吃掉了 durant很開心地把第4個餃子吃掉了
def action(name1, name2): print(‘%s 和 %s 開始1v1鬥牛啦!‘ %(name1, name2)) time.sleep(1) while True: action1 = yield print(‘%s直接一個加速過掉%s,然後%s‘ %(name1, name2, action1)) time.sleep(1) action2 = yield print(‘%s背身單打%s,%s‘ %(name1, name2, action2)) yield ‘1v1結束‘ def move(): name1 = input(‘>>>‘) name2 = input(‘>>>‘) vs = action(name1, name2) vs.__next__() vs.send(‘一記戰斧劈扣‘) end = vs.send(‘翻身跳投將球投進‘) print(end) p = move()
生產者與消費者模型初探