python_并发编程——消费者和生产者模型
消费者和生产者模型
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_并发编程——消费者和生产者模型的更多相关文章
- 并发编程:生产消费模型、死锁与Rlock、线程、守护线程、信号量、锁
一.生产者消费者模型1 二.生产者消费者模型2 三.守护线程 四.常用方法 五.启动线程的另一种方式 六.锁 七.锁死 八.死锁 九.单个锁能不能死锁 十.信号旗 一.生产者消费者模型1 import ...
- 5 并发编程-(进程)-队列&生产者消费者模型
1.队列的介绍 进程彼此之间互相隔离,要实现进程间通信(IPC),multiprocessing模块支持两种形式:队列和管道,这两种方式都是使用消息传递的 创建队列的类(底层就是以管道和锁定的方式实现 ...
- Java并发编程(1)-Java内存模型
本文主要是学习Java内存模型的笔记以及加上自己的一些案例分享,如有错误之处请指出. 一 Java内存模型的基础 1.并发编程模型的两个问题 在并发编程中,需要了解并会处理这两个关键问题: 1.1.线 ...
- 【Java并发编程】:生产者—消费者模型
生产者消费者问题是线程模型中的经典问题:生产者和消费者在同一时间段内共用同一存储空间,生产者向空间里生产数据,而消费者取走数据. 这里实现如下情况的生产--消费模型: 生产者不断交替地生产两组数据“姓 ...
- 转: python 利用EMQ实现消费者和生产者模型
消费者 """ 测试emq-消费者 @author me """ import paho.mqtt.client as mqtt impor ...
- python_并发编程——管道
1.管道 from multiprocessing import Pipe conn1,conn2 = Pipe() #返回两个值 conn1.send('wdc') #发送 print(conn2. ...
- python 并发编程 非阻塞IO模型
非阻塞IO(non-blocking IO) Linux下,可以通过设置socket使其变为non-blocking.当对一个non-blocking socket执行读操作时,流程是这个样子: 从图 ...
- Java并发编程:Java内存模型JMM
简介 Java内存模型英文叫做(Java Memory Model),简称为JMM.Java虚拟机规范试图定义一种Java内存模型来屏蔽掉各种硬件和系统的内存访问差异,实现平台无关性. CPU和缓存一 ...
- python_并发编程——进程池
1.进程池 from multiprocessing import Pool def func(n): for i in range(10): print(n+1) if __name__ == '_ ...
随机推荐
- C++静态成员变量必须定义
静态成员变量在类中仅仅是声明,没有定义,所以要在类的外面定义,实际上是给静态成员变量分配内存,否则不能使用,编译不会通过. class A { public: static int a; //声明但未 ...
- LeetCode 150. 逆波兰表达式求值(Evaluate Reverse Polish Notation) 24
150. 逆波兰表达式求值 150. Evaluate Reverse Polish Notation 题目描述 根据逆波兰表示法,求表达式的值. 有效的运算符包括 +, -, *, /.每个运算对象 ...
- C++—多态与继承
一.基本概念 1.类的继承,是新的类从已有类那里得到已有的特性.或从已有类产生新类的过程就是类的派生.原有的类称为基类或父类,产生的新类称为派生类或子类. 2.派生类的声明: class 派生类名:继 ...
- SpringBoot(1)
SpringBoot 8/2 CRUD 发送put请求修改数据有三个步骤: SpringMVC中配置HiddenHttpMethodFilter 页面上创建一个post请求(form标签只能写get和 ...
- CORS和CSRF
CORS和CSRF 什么是CORS?CORS是一个W3C标准,全称是"跨域资源共享",他允许浏览器向夸源服务器,发出XMLHTTPRequest请求,从而克服了AJAX只能同源使用 ...
- BBR 安装
谷歌云申请搭建翻墙 1.申请谷歌账号 2.申请免费一年谷歌云使用 https://console.cloud.google.com/ 3.设置客户端 xshell/ putty ssh客户端设置 vi ...
- 从create-react-app开始,构建项目架构
1.生成项目 命令行执行:create-react-app myapp,生成如下结构: 2.安装sass依赖,让你在项目中可以使用scss模块化,index.module.scss: npm i n ...
- [LOJ2541] [PKUWC2018] 猎人杀
题目链接 LOJ:https://loj.ac/problem/2541 Solution 很巧妙的思路. 注意到运行的过程中概率的分母在不停的变化,这样会让我们很不好算,我们考虑这样转化:假设所有人 ...
- 在KubeSphere中部署Kubeapps
1. 情况说明 使用一台VMWare Workstation虚拟机,4核8G内存,50G磁盘 已安装KubeSphere 2.1 版本,已经按照官方文档的入门必读,示例一创建好相应的账号信息等 Kub ...
- C# ——Parallel类
一.Parallel类 Parallel类提供了数据和任务的并行性: 二.Paraller.For() Paraller.For()方法类似于C#的for循环语句,也是多次执行一个任务.使用Paral ...