生产者消费者模型案例
Posted tf511
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了生产者消费者模型案例相关的知识,希望对你有一定的参考价值。
1.生产者消费者模型
模型 设计模式 三层结构 等等表示的都是一种编程套路
生产者指的是能够产生数据的一类任务
消费者指的是处理数据的一类任务
需求: 文件夹里有十个文本文档 要求你找出文件中包含习大大关键字的文件
打开并读取文件数据就是生产者
查找关键字的过程就是消费者
生产者消费者模型为什么出现?
生产者的处理能力与消费者的处理能力 不匹配不平衡 导致了一方等待另一方 浪费时间
目前我们通过多进程将生产 和 消费 分开处理
然后将生产者生产的数据通过队列交给消费者
总结一下在生产者消费者模型中 不仅需要生产者消费者 还需要一个共享数据区域
1.将生产方和消费方耦合度降低
2.平衡双方的能力 提高整体效率
代码实现 :
搞两个进程 一个负责生产 一个负责消费
数据需要共享所以来个队列
import time,random from multiprocessing import Process,Queue # 制作热狗 def make_hotdog(queue,name): for i in range(3): time.sleep(random.randint(1,2)) print("%s 制作了一个热狗 %s" % (name,i)) # 生产得到的数据 data = "%s生产的热狗%s" % (name,i) # 存到队列中 queue.put(data) # 装入一个特别的数据 告诉消费方 没有了 #queue.put(None) # 吃热狗 def eat_hotdog(queue,name): while True: data = queue.get() if not data:break time.sleep(random.randint(1, 2)) print("%s 吃了%s" % (name,data)) if __name__ == ‘__main__‘: #创建队列 q = Queue() p1 = Process(target=make_hotdog,args=(q,"邵钻钻的热狗店")) p2 = Process(target=make_hotdog, args=(q, "egon的热狗店")) p3 = Process(target=make_hotdog, args=(q, "老王的热狗店")) c1 = Process(target=eat_hotdog, args=(q,"思聪")) c2 = Process(target=eat_hotdog, args=(q, "李哲")) p1.start() p2.start() p3.start() c1.start() c2.start() # 让主进程等三家店全都做完后.... p1.join() p2.join() p3.join() # 添加结束标志 注意这种方法有几个消费者就加几个None 不太合适 不清楚将来有多少消费者 q.put(None) q.put(None) # 现在 需要知道什么时候做完热狗了 生产者不知道 消费者也不知道 # 只有队列知道 print("主进程over") # 生产方不生产了 然而消费方不知道 所以已知等待 get函数阻塞 # 三家店都放了一个空表示没热狗了 但是消费者只有两个 他们只要看见None 就认为没有了 # 于是进程也就结束了 造成一些数据没有被处理 # 等待做有店都做完热狗在放None
import time,random from multiprocessing import Process,JoinableQueue # 制作热狗 def make_hotdog(queue,name): for i in range(3): time.sleep(random.randint(1,2)) print("%s 制作了一个热狗 %s" % (name,i)) # 生产得到的数据 data = "%s生产的热狗%s" % (name,i) # 存到队列中 queue.put(data) # 装入一个特别的数据 告诉消费方 没有了 #queue.put(None) # 吃热狗 def eat_hotdog(queue,name): while True: data = queue.get() time.sleep(random.randint(1, 2)) print("%s 吃了%s" % (name,data)) # 该函数就是用来记录一共给消费方多少数据了 就是get次数 queue.task_done() if __name__ == ‘__main__‘: #创建队列 q = JoinableQueue() p1 = Process(target=make_hotdog,args=(q,"邵钻钻的热狗店")) p2 = Process(target=make_hotdog, args=(q, "egon的热狗店")) p3 = Process(target=make_hotdog, args=(q, "老王的热狗店")) c1 = Process(target=eat_hotdog, args=(q,"思聪")) c2 = Process(target=eat_hotdog, args=(q, "李哲")) p1.start() p2.start() p3.start() # 将消费者作为主进程的守护进程 c1.daemon = True c2.daemon = True c1.start() c2.start() # 让主进程等三家店全都做完后.... p1.join() p2.join() p3.join() # 如何知道生产方生产完了 并且 消费方也吃完了 # 方法一:等待做有店都做完热狗在放None # # 添加结束标志 注意这种方法有几个消费者就加几个None 不太合适 不清楚将来有多少消费者 # q.put(None) # q.put(None) # 主进程等到队列结束时再继续 那队列什么时候算结束? 生产者已经生产完了 并且消费者把数据全取完了 q.join() # 已经明确生产放一共有多少数据 # 现在 需要知道什么时候做完热狗了 生产者不知道 消费者也不知道 # 只有队列知道 print("主进程over") # 生产方不生产了 然而消费方不知道 所以一直等待 get函数阻塞 # 三家店都放了一个空表示没热狗了 但是消费者只有两个 他们只要看见None 就认为没有了 # 于是进程也就结束了 造成一些数据没有被处理
以上是关于生产者消费者模型案例的主要内容,如果未能解决你的问题,请参考以下文章