生产者与消费者模型初探

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()
原文地址:https://www.cnblogs.com/cjsword/p/10442879.html