进程对列,生产者和消费者,JoinableQueue
1.进程对列
让进程之间共享资源
先进先出
(1)基本语法
from multiprocessing import Process,Queue
q = Queue()
# 1.用put方法往队列中存值
q.put(111)
# 2.用get方法从队列中取值
res= q.get()
print(res)
# 3.当队列中没有值,再调用get就会发生阻塞
res = q.get()
print(res)
# 4.get_nowait 在没有值的时候,直接报错。错在兼容性问题,不推荐使用
res = q.get_nowait()
print(res) # (2) 指定队列长度 可以适用queue
q1 = Queue(3)
q1.put(11)
q1.put(22)
q1.put(33)
# 注意:如果超出队列长度,直接阻塞
# q1.put(44)
# 注意:如果超出了队列长度,直接报错(不推荐)
# q1.put_nowait(44)
(2)多进程之间共享数据
from multiprocessing import Process,Queue
def func(q):
# 2.在子进程中获取数据
res = q.get()
print(res)
# 3.子进程添加数据
q.put("bbb") if __name__ == '__main__':
q2 = Queue()
p1 = Process(target=func,args=(q2,))
p1.start() # 1.在主进程中,添加数据
q2.put("aaa") # 为了能够拿到子进程中添加的队列元素,需要等待子进程执行结束后获取
p1.join() # 4.主进程获取子进程添加的数据
res = q2.get()
print("主进程执行结束:值%s" % (res))
2.生产者和消费者模型
# 爬虫例子:
1号进程负责抓取网页当中的内容
2号进程负责匹配网页当中的关键字
1号进程可以理解为生产者
2号进程可以理解为消费者
理想的生产者和消费者模型:彼此运行的速度相当;
从程序上来讲:
生产者就是负责存储数据(put)
消费者就是负责获取数据(get)
(1)基本语法
from multiprocessing import Process,Queue
import time,random
def consumer(q,name):
while True:
food = q.get()
time.sleep(random.uniform(0.1,1))
print("%s 吃了一个%s"% (name,food)) # 生产者模型
def producer(q,name,food):
for i in range(5):
time.sleep(random.uniform(0.1,1))
print("%s 生产了 %s%s"%(name,food,i))
q.put(food+str(i)) if __name__ == '__main__':
q=Queue()
# 创建生产者
p1 = Process(target=producer,args=(q,"周永林","大便"))
p1.start() # 创建消费者
c1 = Process(target=consumer,args=(q,"张龙"))
c1.start() p1.join() print("主程序执行结束。。。")
3.JoinableQueue
put 寻访
get 获取
task_done 队列数据减一
join 阻塞
task_done 与 join 通过一个中间变量统计队列中元素个数
每放入一个值,成员中的中间变量值加1
每执行一次task_done,成员中的中间变量值减1
join 会根据中间变量值来确定是阻塞还是放行
如果中间变量是0 意味着放行
如果中间变量不是0 意味着阻塞
(1)基本用法
from multiprocessing import Process,JoinableQueue
jq = JoinableQueue()
jq.put("abab")
print(jq.get())
jq.task_done()
# jq.join()
print("finish")
(2)生产者和消费者模型
from multiprocessing import Process,JoinableQueue
# 消费着模型
def consumer(q,name):
while True:
food = q.get()
time.sleep(random.uniform(0.1,1))
print("%s吃了一个%s"%(name,food))
q.task_done()
#生产着模型
def producer(q,name,food):
for i in range(5):
time.sleep(random.uniform(0.1,1))
print("%s生产了 %s%s"%(name,food,i))
q.put(food+str(i)) if __name__ == '__main__':
# 创建队列
jq = JoinableQueue()
#消费着进程
c1 = Process(target=consumer,args=(jq,"张晓东"))
c1.daemon = True
c1.start() #生产者进程
p1 = Process(target=producer,args=(jq,"黄乐熙","大茄子"))
p1.start() #等待生产者把所有数据放到队列中;
p1.join()
# 直到所有数据被消费完毕之后,放行。
jq.join() print("主程序执行结束。。。")
进程对列,生产者和消费者,JoinableQueue的更多相关文章
- Rabbitmq 消息对列 生产者与消费者的具体实现 springboot
RabbitMQ 基本介绍 RabbitMQ的设计理念是.只要有接收消息的队列. 邮件就会存放到队列里. 直到订阅人取走. . 如果没有可以接收这个消息的消息队列. 默认是抛弃这个消息的.. 我实现的 ...
- Java实现PV操作 | 生产者与消费者
导语 在学习操作系统的过程中,PV操作是很重要的一个环节.然而面对书本上枯燥的代码,每一个爱好技术的人总是想能亲自去实现.现在我要推出一个专题,专门讲述如何用Java实现PV操作,让操作系统背后的逻辑 ...
- Python 之并发编程之进程下(事件(Event())、队列(Queue)、生产者与消费者模型、JoinableQueue)
八:事件(Event()) # 阻塞事件: e = Event() 生成事件对象e e.wait() 动态给程序加阻塞,程序当中是否加阻塞完全取决于该对象中的is_set() [默认返回值 ...
- python并发编程之守护进程、互斥锁以及生产者和消费者模型
一.守护进程 主进程创建守护进程 守护进程其实就是'子进程' 一.守护进程内无法在开启子进程,否则会报错二.进程之间代码是相互独立的,主进程代码运行完毕,守护进程也会随机结束 守护进程简单实例: fr ...
- (并发编程)进程IPC,生产者消费者模型,守护进程补充
一.IPC(进程间通信)机制进程之间通信必须找到一种介质,该介质必须满足1.是所有进程共享的2.必须是内存空间附加:帮我们自动处理好锁的问题 a.from multiprocessing import ...
- 守护进程,互斥锁,IPC,队列,生产者与消费者模型
小知识点:在子进程中不能使用input输入! 一.守护进程 守护进程表示一个进程b 守护另一个进程a 当被守护的进程结束后,那么守护进程b也跟着结束了 应用场景:之所以开子进程,是为了帮助主进程完成某 ...
- 多进程(了解):守护进程,互斥锁,信号量,进程Queue与线程queue(生产者与消费者模型)
一.守护进程 主进程创建守护进程,守护进程的主要的特征为:①守护进程会在主进程代码执行结束时立即终止:②守护进程内无法继续再开子进程,否则会抛出异常. 实例: from multiprocessing ...
- 守护进程,进程安全,IPC进程间通讯,生产者消费者模型
1.守护进程(了解)2.进程安全(*****) 互斥锁 抢票案例3.IPC进程间通讯 manager queue(*****)4.生产者消费者模型 守护进程 指的也是一个进程,可以守护着另一个进程 一 ...
- 20181229(守护进程,互斥锁,IPC,生产者和消费者模型)
一.守护进程 守护进程:一个进程B守护另一个进程A,当被守护的进程A结束,进程B也就结束了.(不一定同生,但会同死) 两个特点: ①守护进程会在主进程代码执行结束后就终止 ②守护进程内无法再开启子进程 ...
随机推荐
- [Abp vNext微服务实践] - 添加中文语言
简介 abp vNext中提供了多语言功能,默认语言是英文,没有提供中文语言包.在业务开发中,定义权限后需要用中文的备注提供角色选择,本篇将介绍如何在abp vNext中加入中文语言. step1:添 ...
- Educational Codeforces Round 37-F.SUM and REPLACE (线段树,线性筛,收敛函数)
F. SUM and REPLACE time limit per test2 seconds memory limit per test256 megabytes inputstandard inp ...
- 挺棒的七个Python图形应用GUI开发框架
作为Pyhon开发者,你迟早都会碰到图形用户界面(GUI)应用开发任务,目前市场上有大量Python GUI开发框架可供选择,Python wiki GUI programming给出了超过30个跨平 ...
- FFmpeg常用命令学习笔记(一)基本信息查询命令
笔者才开始学习音视频开发,FFmpeg学习笔记系列主要是从慕课网李超老师的FFmpeg音视频核心技术精讲与实战课程学习的心得体会. FFmpeg音视频核心技术精讲与实战:https://coding. ...
- java递归方法查找某目录下包含有某字符串的文件
最近在安装mysql5.6的时候,因为是免安装版的所以有些配置项需要手动配置.但是配置某一项的时候(例如:max_allowed_packet=xxxxx),不知道max_allowed_packet ...
- barcode模块: plus.barcode.scan 进行扫描图片出现无法识别二维码,打印的错误信息是code:8,message:''
原因之一:图片的像素太大了,无法识别. 解决方法: 压缩一下图片. 这里的 data 我放了一个 像素为 4040 × 4040 的 图片. 进行识别的时候会报, (无法识别的图片,都是返回这些值) ...
- springboot 详解RestControllerAdvice(ControllerAdvice)(转)
springboot 详解RestControllerAdvice(ControllerAdvice)拦截异常并统一处理简介 @Target({ElementType.TYPE}) @Retentio ...
- 【Android-自定义控件】 漂亮的Toast
修改Toast属性,美化Toast //创建一个Toast Toast toast=new Toast(getApplicationContext()); //创建Toast中的文字 TextView ...
- HGOI 20191108 题解
Problem A 新婚快乐 一条路,被$n$个红绿灯划分成$n+1$段,从前到后一次给出每一段的长度$l_i$,每走$1$的长度需要$1$分钟. 一开始所有红绿灯都是绿色的,$g$分钟后所有红绿灯变 ...
- Linux下更换为阿里yum源
更新日期: 2018-08-06 1.yum源的工作原理 yum是为了解决安装包的依赖关系而生的,如果要源码安装一个软件,需要频繁下载各个包,并解决包的依赖关系.这就好比学门课程,要学会这门课程,就要 ...