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)
一个奋斗中的产品小白