消费者和生产者模型

from multiprocessing import Process,Queue
import time
import random class Producer(Process):
def __init__(self,name,food,q):
super().__init__()
self.name = name
self.food = food
self.q = q
def run(self):
for i in range(1,11):
time.sleep(random.randint(1,3)) #1到3秒生产一个数据
f = '{}生产了第{}个{}'.format(self.name,i,self.food)
print(f)
self.q.put(f) class Consumer(Process):
def __init__(self,name,q):
super().__init__()
self.name = name
self.q = q def run(self):
while True:
food = self.q.get()
if food is None:
print('{}获取了一个空~结束'.format(self.name))
break #如果进程获取到空值 则跳出结束循环
else:
print('{}吃了{}'.format(self.name,food))
time.sleep(random.randint(1, 3)) if __name__ == '__main__':
q = Queue(20)
p1 = Producer('wdc','包子',q)
p2 = Producer('yhf','馒头',q)
c1 = Consumer('qqq',q)
c2 = Consumer('www',q)
p1.start()
p2.start()
c1.start()
c2.start()
p1.join() #感知p1和p2的结束
p2.join()
q.put(None) #给队列中添加两个空值,供消费者最后获取
q.put(None)

结果:,这种方法虽然能够实现这种功能,但是如果再增加消费者的话,就要再后面继续加q.put(None)。

改进:

from multiprocessing import Process,JoinableQueue
import time
import random class Producer(Process):
def __init__(self,name,food,q):
super().__init__()
self.name = name
self.food = food
self.q = q
def run(self):
for i in range(1,11):
time.sleep(random.randint(1,3)) #1到3秒生产一个数据
f = '{}生产了第{}个{}'.format(self.name,i,self.food)
print(f)
self.q.put(f)
self.q.join() #阻塞,直到一个队列中的所有数据全部被处理完毕。在这里的作用就是在这里等待生产的所有的食物被吃完,再继续进行 class Consumer(Process):
def __init__(self,name,q):
super().__init__()
self.name = name
self.q = q def run(self):
while True:
food = self.q.get()print('{}吃了{}'.format(self.name,food))
time.sleep(random.randint(1, 3))
self.q.task_done() #如果是JoinableQueue,一般get()之后都要和task_done()结合使用:累次一个计数器,每取出一个数据,就做一个计数器减1 if __name__ == '__main__':
q = JoinableQueue(20)
p1 = Producer('wdc','包子',q)
p2 = Producer('yhf','馒头',q)
c1 = Consumer('qqq',q)
c2 = Consumer('www',q)
p1.start()
p2.start()
c1.daemon = True #将c1和c2都设置成守护进程,主进程的代码执行结束,守护进程自动结束。
c2.daemon = True
c1.start()
c2.start()
p1.join() #感知p1和p2的结束
p2.join()

结果:

改进后的执行过程:

  在消费者这一端:

   每次获取一个数据,处理一个数据,发送一个记号:标志一个数据被处理成功

  在生产者这一端:

   每次生产一个数据,且每依次的数据都放在队列当中,当生产者生产完毕之后,发送一个join信号,表示已经停止生产数据了且在这里阻塞,等待消费者处理队列中的数据,当数据都被处理完时,join的阻塞结束。

总结:

python_并发编程——消费者和生产者模型的更多相关文章

  1. 并发编程:生产消费模型、死锁与Rlock、线程、守护线程、信号量、锁

    一.生产者消费者模型1 二.生产者消费者模型2 三.守护线程 四.常用方法 五.启动线程的另一种方式 六.锁 七.锁死 八.死锁 九.单个锁能不能死锁 十.信号旗 一.生产者消费者模型1 import ...

  2. 5 并发编程-(进程)-队列&生产者消费者模型

    1.队列的介绍 进程彼此之间互相隔离,要实现进程间通信(IPC),multiprocessing模块支持两种形式:队列和管道,这两种方式都是使用消息传递的 创建队列的类(底层就是以管道和锁定的方式实现 ...

  3. Java并发编程(1)-Java内存模型

    本文主要是学习Java内存模型的笔记以及加上自己的一些案例分享,如有错误之处请指出. 一 Java内存模型的基础 1.并发编程模型的两个问题 在并发编程中,需要了解并会处理这两个关键问题: 1.1.线 ...

  4. 【Java并发编程】:生产者—消费者模型

    生产者消费者问题是线程模型中的经典问题:生产者和消费者在同一时间段内共用同一存储空间,生产者向空间里生产数据,而消费者取走数据. 这里实现如下情况的生产--消费模型: 生产者不断交替地生产两组数据“姓 ...

  5. 转: python 利用EMQ实现消费者和生产者模型

    消费者 """ 测试emq-消费者 @author me """ import paho.mqtt.client as mqtt impor ...

  6. python_并发编程——管道

    1.管道 from multiprocessing import Pipe conn1,conn2 = Pipe() #返回两个值 conn1.send('wdc') #发送 print(conn2. ...

  7. python 并发编程 非阻塞IO模型

    非阻塞IO(non-blocking IO) Linux下,可以通过设置socket使其变为non-blocking.当对一个non-blocking socket执行读操作时,流程是这个样子: 从图 ...

  8. Java并发编程:Java内存模型JMM

    简介 Java内存模型英文叫做(Java Memory Model),简称为JMM.Java虚拟机规范试图定义一种Java内存模型来屏蔽掉各种硬件和系统的内存访问差异,实现平台无关性. CPU和缓存一 ...

  9. python_并发编程——进程池

    1.进程池 from multiprocessing import Pool def func(n): for i in range(10): print(n+1) if __name__ == '_ ...

随机推荐

  1. 最新 奥买家java校招面经 (含整理过的面试题大全)

    从6月到10月,经过4个月努力和坚持,自己有幸拿到了网易雷火.京东.去哪儿.奥买家等10家互联网公司的校招Offer,因为某些自身原因最终选择了奥买家.6.7月主要是做系统复习.项目复盘.LeetCo ...

  2. tp5之服务器不显示验证码

    今天在使用tp框架的时候遇到的一个bug,前辈们早已有解决方法,遇到了做个笔记 TP5框架,自带的验证码在本地localhost运行是没问题的,可以正常显示,如图: 然后,把框架拿到服务器是去运行,验 ...

  3. Google深度学习开源框架TenseorFlow安装

    Google近期发布了TensorFlow,考录到Google出品,必属精品,估计这玩意会火,不过火钳刘明已经来不及了 今天才想着安装来试试 TensorFlow官网:https://www.tens ...

  4. 《Redis Mysql 双写一致性问题》

    一:序 - 最近在对数据做缓存时候,会涉及到如何保证 数据库/Redis 一致性问题. - 刚好今天来总结下 一致性问题 产生的问题,和可能存在的解决方案. 二:(更新策略)-  先更新数据库,后更新 ...

  5. Delphi 10.2 JSON与对象/结构体序列化性能提高100多倍

    今天在盒子闲逛,无意中看到有人说XE7自带的Json对象序列化很慢,帖子在这里:http://bbs.2ccc.com/topic.asp?topicid=464378;经过测试的确如此.     但 ...

  6. 初学者用pycharm创建一个django项目和一个app时需要注意的事项

    如何新建一个djiango项目: 1.在pycharm中点击File,选择new project,点击djiango,在右面的Location中将untitile改为你的项目名,其余部分注意见下图: ...

  7. 作为一个纯粹数据结构的 Redis Streams

    来源:antirez 翻译:Kevin (公众号:中间件小哥) Redis 5 中引入了一个名为 Streams 的新的 Redis 数据结构,吸引了社区极大的兴趣.接下来,我会在社区里进行调查,同用 ...

  8. PKUSC2019题解

    $D1T1$:$n$个村庄,第$i$个村庄的人要去第$p_i$个村庄(保证$p_i$为排列),每次可以将相邻两个村庄的人位置交换直到所有人都到达目的地.再给定一个长为$n-1$的排列$a$,表示第$i ...

  9. Java 处理异常

    Java中 ,catch块和 finally块中都有可能发生异常,这时候就需要 用throw 抛出异常       类似于 C#里方法体中的 throw:

  10. C# vb .net实现移除透明度效果

    在.net中,如何简单快捷地实现Photoshop滤镜组中的移除透明度效果呢?答案是调用SharpImage!专业图像特效滤镜和合成类库.下面开始演示关键代码,您也可以在文末下载全部源码: 设置授权 ...