生产者消费者模型(Queue,JoinableQueue)
生产者消费者模型 主要是为解耦 借助队列来实现生产者消费者模型 栈:先进后出(First In Last Out 简称 FILO) 队列: 先进先出(First In First Out 简称 FIFO) import queue # 不能进行多进程之间的数据传输(1)from multiprocessing import Queue 借助Queue解决生产者消费者模型 队列是安全的。 q = Queue(num) num : 队列的最大长度 q.get()# 阻塞等待获取数据,如果有数据直接获取,如果没有数据,阻塞等待 q.put()# 阻塞,如果可以继续往队列中放数据,就直接放,不能放就阻塞等待 q.get_nowait()# 不阻塞,如果有数据直接获取,没有数据就报错 q.put_nowait()# 不阻塞,如果可以继续往队列中放数据,就直接放,不能放就报错代码:
from multiprocessing import Queue,Processimport time
def consumer(q,name): while 1: info = q.get() if info: print('%s 拿走了%s'%(name,info)) else:# 当消费者获得队列中数据时,如果获得的是None,就是获得到了生产者不再生产数据的标识 break# 此时消费者结束即可
# 消费者如何判断,生产者是没来得及生产数据,还是生产者不再生产数据了?# 如果你尝试用get_nowait() + try 的方式去尝试获得生产者不再生产数据,此时是有问题的。
def producer(q,product): for i in range(20): info = product + '的娃娃%s号'%str(i) q.put(info) q.put(None)# 让生产者生产完数据后,给消费者一个不再生产数据的标识
if __name__ == '__main__': q = Queue(10) p_pro = Process(target=producer,args=(q,'岛国米饭保你爱')) p_con = Process(target=consumer,args=(q,'alex')) p_pro.start() p_con.start()
############################################### 将生产者生产结束的标识,放到父进程中
from multiprocessing import Queue,Processimport time
def consumer(q,name,color): while 1: info = q.get() if info: print('%s %s 拿走了%s \033[0m'%(color,name,info)) else:# 当消费者获得队列中数据时,如果获得的是None,就是获得到了生产者不再生产数据的标识 break# 此时消费者结束即可
# 消费者如何判断,生产者是没来得及生产数据,还是生产者不再生产数据了?# 如果你尝试用get_nowait() + try 的方式去尝试获得生产者不再生产数据,此时是有问题的。
def producer(q,product): for i in range(20): info = product + '的娃娃%s号'%str(i) q.put(info)
if __name__ == '__main__': q = Queue(10) p_pro1 = Process(target=producer,args=(q,'岛国米饭保你爱')) p_pro2 = Process(target=producer,args=(q,'苍老师版')) p_pro3 = Process(target=producer,args=(q,'波多多版')) p_con1 = Process(target=consumer,args=(q,'alex','\033[31m')) p_con2 = Process(target=consumer,args=(q,'wusir','\033[32m')) p_l = [p_con1,p_con2,p_pro1,p_pro2,p_pro3] [i.start() for i in p_l] # 父进程如何感知到生产者子进程不再生产数据了? p_pro1.join() p_pro2.join() p_pro3.join() q.put(None)# 几个消费者就要接受几个结束标识 q.put(None)
(2)from multiprocessing import JoinableQueue#可连接的队列 JoinableQueue是继承Queue,所以可以使用Queue中的方法 并且JoinableQueue又多了两个方法 q.join()# 用于生产者。等待 q.task_done的返回结果,通过返回结果,生产者就能获得消费者当前消费了多少个数据 q.task_done() # 用于消费者,是指每消费队列中一个数据,就给join返回一个标识。代码:
from multiprocessing import Process,JoinableQueue
q = JoinableQueue()
q.join()# 用于生产者。等待 q.task_done的返回结果,通过返回结果,生产者就能获得消费者当前消费了多少个数据q.task_done() # 用于消费者,是指每消费队列中一个数据,就给join返回一个标识。
假设生产者生产了100个数据,join就能记录下100这个数字。每次消费者消费一个数据,就必须要task_done返回一个标识,当生产者(join)接收到100个消费者返回来的标识的时候,生产者就能知道消费者已经把所有数据都消费完了。
from multiprocessing import Queue,Processimport time
def consumer(q,name,color): while 1: info = q.get() print('%s %s 拿走了%s \033[0m'%(color,name,info)) q.task_done()
def producer(q,product): for i in range(20): info = product + '的娃娃%s号'%str(i) q.put(info) q.join()# 记录了生产了20个数据在队列中,此时会阻塞等待消费者消费完队列中所有数据
if __name__ == '__main__': q = JoinableQueue(10) p_pro = Process(target=producer,args=(q,'岛国米饭保你爱')) p_con = Process(target=consumer,args=(q,'alex','\033[31m')) p_con.daemon = True# 把消费者进程设为守护进程 p_con.start() p_pro.start() p_pro.join()# 主进程等待生产者进程结束 程序有3个进程,主进程和生产者进程和消费者进程。 当主进程执行到35行代码时,主进程会等待生产进程结束 而生产进程中(第26行)会等待消费者进程把所有数据消费完,生产者进程才结束。 现在的状态就是 主进程等待生产者进程结束,生产者进程等待消费者消费完所有数据 所以,把消费者设置为守护进程。 当主进程执行完,就代表生产进程已经结束,也就代表消费者进程已经把队列中数据消费完 此时,主进程一旦结束,守护进程也就是消费者进程也就跟着结束。 整个程序也就能正常结束了。
生产者消费者模型(Queue,JoinableQueue)的更多相关文章
- 并发编程 - 进程 - 1.队列的使用/2.生产者消费者模型/3.JoinableQueue
1.队列的使用: 队列引用的前提: 多个进程对同一块共享数据的修改:要从硬盘读文件,慢,还要考虑上锁: 所以就出现了 队列 和 管道 都在内存中(快): 队列 = 管道 + 上锁 用队列的目的: 进程 ...
- Day034--Python--锁, 信号量, 事件, 队列, 生产者消费者模型, joinableQueue
进程同步: 1. 锁 (重点) 锁通常被用来实现对共享资源的同步访问.为每一个共享资源创建一个Lock对象,当你需要访问该资源时,调用acquire方法来获取锁对象(如果其它线程已经获得了该锁, ...
- Python学习笔记——进阶篇【第九周】———线程、进程、协程篇(队列Queue和生产者消费者模型)
Python之路,进程.线程.协程篇 本节内容 进程.与线程区别 cpu运行原理 python GIL全局解释器锁 线程 语法 join 线程锁之Lock\Rlock\信号量 将线程变为守护进程 Ev ...
- #queue队列 #生产者消费者模型
#queue队列 #生产者消费者模型 #queue队列 #有顺序的容器 #程序解耦 #提高运行效率 #class queue.Queue(maxsize=0) #先入先出 #class queue.L ...
- Python 之并发编程之进程下(事件(Event())、队列(Queue)、生产者与消费者模型、JoinableQueue)
八:事件(Event()) # 阻塞事件: e = Event() 生成事件对象e e.wait() 动态给程序加阻塞,程序当中是否加阻塞完全取决于该对象中的is_set() [默认返回值 ...
- python并发编程之多进程(二):互斥锁(同步锁)&进程其他属性&进程间通信(queue)&生产者消费者模型
一,互斥锁,同步锁 进程之间数据不共享,但是共享同一套文件系统,所以访问同一个文件,或同一个打印终端,是没有问题的, 竞争带来的结果就是错乱,如何控制,就是加锁处理 part1:多个进程共享同一打印终 ...
- joinablequeue模块 生产者消费者模型 Manager模块 进程池 管道
一.生产者消费者 主要是为解耦(借助队列来实现生产者消费者模型) import queue # 不能进行多进程之间的数据传输 (1)from multiprocessing import Queue ...
- python开发进程:互斥锁(同步锁)&进程其他属性&进程间通信(queue)&生产者消费者模型
一,互斥锁,同步锁 进程之间数据不共享,但是共享同一套文件系统,所以访问同一个文件,或同一个打印终端,是没有问题的, 竞争带来的结果就是错乱,如何控制,就是加锁处理 part1:多个进程共享同一打印终 ...
- Python守护进程、进程互斥锁、进程间通信ICP(Queue队列)、生产者消费者模型
知识点一:守护进程 守护进程:p1.daemon=True 守护进程其实就是一个“子进程“,守护=>伴随 守护进程会伴随主进程的代码运行完毕后而死掉 进程:当父进程需要将一个任务并发出去执行,需 ...
随机推荐
- WCF异常相关
1.端口没打开 解决办法: services.msc 启动Net.Tcp Port Sharing Service 2.由于访问被拒,服务终结点未能侦听 URI“net.tcp://localhost ...
- Java8函数式编程学习笔记(初探)
编程语言的整个目的就在于操作值,要是按照历史上编程语言的传统,这些值被成为一等值,而编程语言中的其他结构也许有助于表示值的结构,但在程序执行期间不能传递,因此为二等值,比如方法和类等则是二等值,类可以 ...
- java安装教程及环境配置
下载JDK(网上有很多,可以百度) 首先在非系统盘(系统盘通常是C盘)中,新建一个Java(可以是其他名称,必须是英文且名称中没有空格)文件夹,并在这个文件夹中创建JDK,JRE两个文件夹. 双击已下 ...
- hdu5228
bc41第一题 德州扑克的背景,给出五张牌,问最少要换多少张牌能凑齐同花顺 其实很水,数据量很小,随便暴力,越粗暴越好,然后我wa了一发因为没有看全题目,10\11\12\13\1也是一组同花顺``` ...
- ATOM & Sublime Text 下MarkDown插件功能比较
ATOM & Sublime Text 下MarkDown插件功能比较 作者:net66 更新日期:2016-6-14 10:50 [一] 编辑器 Sublime Text3 vs Atom ...
- Linux驱动中常用的宏
.module_i2c_driver(adxl34x_driver)展开为 static int __int adxl34x_driver_init(void) { return i2c_regist ...
- All the Apache Streaming Projects: An Exploratory Guide
The speed at which data is generated, consumed, processed, and analyzed is increasing at an unbeliev ...
- sql server merge into 与update 批量更新1 百万测试数据的性能比较
1. 1百万的测试数据的生成 declare @index int; begin set @index=0; while @index<1000000 begin insert int ...
- HTTP 返回状态消息讲解
当浏览器从 web 服务器请求服务时,可能会发生错误. 从而有可能会返回下面的一系列状态消息: 1xx: 信息 消息: 描述: 100 Continue 服务器仅接收到部分请求,但是一旦服务器并没有拒 ...
- 【转】【iOS】动态更换App图标
原文网址:http://www.cocoachina.com/ios/20170619/19557.html 前言 动态更换App图标这件事,在用户里总是存在需求的:有些用户喜欢“美化”自己的手机.至 ...