【1.46】生产者消费者模型
生产包子
吃包子
1、原始模型
1 # coding=utf-8 2 def producer(): 3 ret = [] 4 for i in range(10000): 5 ret.append(i) 6 return ret 7 8 def cousumer(res): 9 for index,baozi in enumerate(res): 10 print("第%s个人,吃了%s"%(index+1,baozi+1)) 11 12 res = producer() 13 cousumer(res) 14 15 #本来这是一个并发进行 16 #但是这里是生产完包子 才开始吃 17 #这样就会占用大量的内存,效率低 18 #应该使用生成器模型来
吃包子:
# coding=utf-8 def producer(): ret = [] for i in range(10000): ret.append(i) return ret def cousumer(res): for index, baozi in enumerate(res): print("第%s个人,吃了%s" % (index + 1, baozi + 1)) res = producer() cousumer(res) # 本来这是一个并发进行 # 但是这里是生产完包子 才开始吃 # 这样就会占用大量的内存,效率低 # 应该使用生成器模型来 #改写 def test(): print("开始") yield 1 print("22") yield 2 print("33") yield 3 test1=test() #这里有yield 就是生成器函数 #执行 test1 没有返回值,这里只是拿到了生成器 #执行 __next__ 才会执行下一步 这就是生成器保存状态 print (test1.__next__()) #开始 1 实现从当前状态执行到下一个yield执行完 停下 #触发 生成器运行的方法 3 种方法 #send #next #__next__ print(test1.send(None)) #22 2 实现从当前状态执行到下一个yield执行完 停下 #这里我们看看None在哪里 #就是在 他执行 yield 后 的返回值 #1 可以实现next 功能, 2 、可以将send 中的None 值 传给yield 然后再传给 执行yield 的返回值 # print(next(test1)) #33 3 实现从当前状态执行到下一个yield执行完 停下 def cousumer(name): print("我是%s,我来吃包子"%name) while True: baozi=yield print("%s吃[%s]"%(name,baozi)) def ducu(): for i in range(500): yield "包子%s"%i def chihuo(): for i in range(100): yield "%s号吃货"%i def maibaozi(): a = ducu() chi=chihuo() for i in chi: c1 = cousumer(i) c1.__next__() for i in range(5): c1.send(a.__next__()) maibaozi()
浙公网安备 33010602011771号