消费者和生产者模型

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. js 打印条形码

    相应的文件大家去github上下载吧 https://github.com/lindell/JsBarcode <!DOCTYPE html> <html> <head& ...

  2. Hack The Box Web Pentest 2017

    [20 Points] Lernaean [by [Arrexel] 问题描述: Your target is not very good with computers. Try and guess ...

  3. c+11 std::condition_variable and mutex

    multiple threads synchronization primitive: 多线程同步语义 多线程的同步语义是多线程编程的核心,线程之间通过同步语义进行通信,实现并发.C++ JAVA 中 ...

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

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

  5. 创建 django 项目命令

    创建Django项目 django-admin startproject HelloWorld Django创建app cd HelloWorld python manage.py startapp ...

  6. AOP+Redis锁防止表单重复提交

    确保分布式锁同时满足以下四个条件 1.互斥性.在任意时刻,只有一个客户端能持有锁 2.不会发生死锁.即使有一个客户端在持有锁的期间崩溃而没有主动解锁,也能保证后续其他客户端能加锁 3.具有容错性.只要 ...

  7. [转帖]首颗国产DRAM芯片的技术与专利,合肥长鑫存储的全面深度剖析

    首颗国产DRAM芯片的技术与专利,合肥长鑫存储的全面深度剖析 https://mp.weixin.qq.com/s/g_gnr804q8ix4b9d81CZ1Q 2019.11 存储芯片已经成为全球珍 ...

  8. ssh远程连接一段时间会失效的问题

    话不多讲,先说明我的环境和远程环境. 本地环境:Ubuntu18.04(client) 远程环境:Ubuntu16.04(server) 我的一个小项目部署在百度云的Ubuntu服务器上,需要经常使用 ...

  9. Deep one-class classification

    Deep one-class classification 2019-03-17 23:09:59 zpainter 阅读数 1027  收藏 文章标签: 单分类问题异常检测 更多 分类专栏: 论文 ...

  10. 聊一聊,React开发中应该规避的点

    原文永久链接: https://github.com/AttemptWeb..... 下面说到的React开发中注意的问题,部分是自己遇到过的点,部分是收集的,也算是React代码优化部分,这次做一个 ...