python课堂整理20----生产者消费者模型

一、实现功能:店铺生产包子,消费者来吃

import time
def producter():
    ret = []
    for i in range(10):
        time.sleep(0.1)
        ret.append('包子%s'%i)
    return ret

def consumer(res):
    for index, baozi in enumerate(res):
        time.sleep(0.1)
        print('第%s个人吃了%s'%(index, baozi))

a = producter()
consumer(a)

弊端:生产包子和吃包子是两个独立的过程,只有生产者把包子做完,消费者才能开始吃

思考:怎么实现两个程序的并发过程

######################################

从生成器入手,因为生成器函数能保留函数的运行状态

def test():
    print('开始啦')
    yield 0
    print('第一次')
    yield 1
    print('第二次')
    yield 2

t = test() #只是生成一个生成器函数,并没有执行
print(t)
res = t.__next__()
print(res)

 

♦  send()

①send函数必须传入一个参数,也能触发一次生成器

②send将传入的参数传递给yield,此时再把yield赋给一个变量,即保留该参数

def test():
    print('开始啦')
    first = yield 0   #接受send传过来的值,赋值给first
    print('第一次',first)
    yield 1
    print('第二次')
    yield 2

t = test() #只是生成一个生成器函数,并没有执行
res = t.__next__()
print(res)
a = t.send('我喜欢你')
print(a)

♦用上述知识实现生产者消费者并发过程

import time
def consumer(name):
    print('我是%s,我准备吃包子了' %name)
    while True:
        baozi = yield
        time.sleep(0.1)
        print('%s开心地把%s吃掉了' %(name, baozi))


def producter():
    c1 = consumer('dabai')
    c1.__next__()
    for i in range(10):
        time.sleep(0.1)
        c1.send('包子%s' %i)
    return '吃完了,真开心'
a = producter()
print(a)

多人并发过程

import time
def consumer(name):
    print('我是%s,我准备吃包子了' %name)
    while True:
        baozi = yield
        time.sleep(0.1)
        print('%s开心地把%s吃掉了' %(name, baozi))


def producter():
    c1 = consumer('dabai')
    c2 = consumer('jinling')
    c1.__next__()
    c2.__next__()
    for i in range(10):
        time.sleep(0.1)
        c1.send('包子%s' %i)
        c2.send('包子%s' %i)
    return '吃完了,真开心'
a = producter()
print(a)

posted @ 2019-07-18 20:47  绝世刘  阅读(215)  评论(0编辑  收藏  举报