day 7-5 生产者消费者模型
Posted lovepy3
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了day 7-5 生产者消费者模型相关的知识,希望对你有一定的参考价值。
一. 生产者和消费者模型
在并发编程中使用生产者和消费者模式能够解决绝大多数并发问题。该模式通过平衡生产线程和消费线程的工作能力来提高程序的整体处理数据的速度。
二. 为什么要使用生产者和消费者模式
在线程世界里,生产者就是生产数据的线程,消费者就是消费数据的线程。在多线程开发当中,如果生产者处理速度很快,而消费者处理速度很慢,那么生产者就必须等待消费者处理完,才能继续生产数据。同样的道理,如果消费者的处理能力大于生产者,那么消费者就必须等待生产者。为了解决这个问题于是引入了生产者和消费者模式。
三. 什么是生产者消费者模式
生产者消费者模式是通过一个容器来解决生产者和消费者的强耦合问题。生产者和消费者彼此之间不直接通讯,而通过阻塞队列来进行通讯,所以生产者生产完数据之后不用等待消费者处理,直接扔给阻塞队列,消费者不找生产者要数据,而是直接从阻塞队列里取,阻塞队列就相当于一个缓冲区,平衡了生产者和消费者的处理能力。
四. 基于队列实现生产者消费者模型
1 from multiprocessing import Queue,Process 2 import time 3 4 def pro(p): 5 for i in range(3): 6 res = "包子%s" %i 7 time.sleep(2) 8 print("生产者生产了: %s" %res) 9 p.put(res) 10 11 def con(p): 12 while True: 13 res = p.get() 14 time.sleep(1) 15 print("消费者吃了%s"%res) 16 17 18 if __name__ == ‘__main__‘: 19 #容器,一个队列 20 p =Queue() 21 22 #生产者们(可以有多个生产者) 23 p1 = Process(target=pro,args=(p,)) 24 25 26 #消费者们,也可以有多个 27 c1 = Process(target=con,args=(p,)) 28 29 # 启动 30 p1.start() 31 c1.start() 32 print("主进程...")
此时的问题是主进程永远不会结束,原因是:生产者p在生产完后就结束了,但是消费者c在取空了q之后,则一直处于死循环中且卡在q.get()这一步。解决方式无非是让生产者在生产完毕后,往队列中再发一个结束信号,这样消费者在接收到结束信号后就可以break出死循环
1 from multiprocessing import Queue,Process 2 import time 3 4 def pro(p): 5 for i in range(3): 6 res = "包子%s" %i 7 time.sleep(2) 8 print("生产者生产了: %s" %res) 9 p.put(res) 10 11 def con(p): 12 while True: 13 res = p.get() 14 if res == None: #在这里判断,如果最后的数据是None就退出 15 break 16 time.sleep(1) 17 print("消费者吃了%s"%res) 18 19 20 if __name__ == ‘__main__‘: 21 #容器,一个队列 22 p =Queue() 23 24 #生产者们(可以有多个生产者) 25 p1 = Process(target=pro,args=(p,)) 26 27 28 #消费者们,也可以有多个 29 c1 = Process(target=con,args=(p,)) 30 31 # 启动 32 p1.start() 33 c1.start() 34 p1.join() 35 p.put(None) #在确保生产者运行结束后,我们往队列里放入一个None,然在消费者里做一个判断 36 print("主进程...")
以上是关于day 7-5 生产者消费者模型的主要内容,如果未能解决你的问题,请参考以下文章
python—day29 守护进程互斥锁模拟抢票IPC通信机制生产者消费者模型
python学习——day9(ssh,线程和进程,信号量,队列,生产者消费者模型) Alex地址:http://www.cnblogs.com/alex3714/articles/5230609.ht