1. 程式人生 > >生產者與消費者模型初探

生產者與消費者模型初探

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 time

def 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()

生產者與消費者模型初探