生产者消费模型
enumerate()使用
- 如果对一个列表,既要遍历索引又要遍历元素时,首先可以这样写:
list1 = ["这", "是", "一个", "测试"] for i in range (len(list1)): print i ,list1[i] 1 2 3
- 上述方法有些累赘,利用enumerate()会更加直接和优美:
list1 = ["这", "是", "一个", "测试"] for index, item in enumerate(list1): print index, item >>> 0 这 1 是 2 一个 3 测试
def producer(): #模拟生产包子跟吃包子 一般操作 ret = [] for i in range(10000): ret.append("包子%s" %i) return ret def consumer(res): for index,baozi in enumerate(res): print("第%s个人,吃了%s" %(index,baozi)) res = producer() #并发程序 同时运行 consumer(res)
生产者模拟型!
send()也是可以触发yield运行的函数
def consumer(name): print("%s 准备吃包子啦!" %name) while True: baozi = yield print("包子[%s]来了,被[%s]吃了!" %(name,baozi)) c1 = consumer("dage") c1.__next__() c1.send("韭菜馅包子") #send把“韭菜馅包子”赋值给了yield 然后又赋值给了baozi
def consumer(name): #这个代码块相对于上面的代码不用手动添加包子 而是利用函数自动添加包子 print("%s 准备吃包子啦!" %name) while True: baozi = yield print("包子[%s]来了,被[%s]吃了!" %(name,baozi)) def producer(): c1 = consumer("dage") c1.__next__() c1.send("韭菜馅包子") #由send函数跳到了consumer函数 完成切换 send就是把值给当前状态停下的yield producer()
import time def consumer(name): print("%s 准备吃包子啦!" %name) while True: baozi = yield time.sleep(1) print("包子[%s]来了,被[%s]吃了!" %(name,baozi)) def producer(): c1 = consumer("dage") c1.__next__() for i in range(10): #不能只做一个包子 要做多个包子的时候就用for循环 而且利用停顿减缓做包子的时间 time.sleep(1) c1.send("包子%s" %i) producer()