Python 35 进程间的通信(IPC机制)、生产者消费者模型
一:进程间的通信(IPC):先进先出 管道:队列=管道+锁
from multiprocessing import Queue
q=Queue(4)
q.put(['first',],block=True,timeout=3)
q.put({'x':2},block=True,timeout=3)
q.put(3,block=True,timeout=3)
q.put(4,block=True,timeout=3)
print(q.get(block=True,timeout=3))
print(q.get(block=True,timeout=3))
print(q.get(block=True,timeout=3))
print(q.get(block=True,timeout=3))
from multiprocessing import Queue #Queued队列模块 q=Queue() print(q.get())
print(q.get())
print(q.get())
print(q.get()) q.put(['first'],block=True,timeout=3)
q.put({'x':2},block=True,timeout=3)
q.put(3,block=True,timeout=3) print(q.get(block=True,timeout=3))
print(q.get(block=True,timeout=3))
print(q.get(block=True,timeout=3))
print(q.get(block=True,timeout=3)) print(q.get_nowait()) #q.get(block=false)
print(q.get_nowait()) #q.get(block=false)
print(q.get_nowait()) #q.get(block=false)
print(q.get_nowait()) #q.get(block=false)
二:生产者消费者模型
1. 什么是生产者消费者模型
生产者:代指生产数据的任务
消费者:代指处理数据的任务
该模型的工作方式:生产生产数据传递消费者处理
实现方式: 生产者---->队列<------消费者 2. 为什么要用
当程序中出现明细的两类任务,一类负责生产数据,一类负责处理数据,
就可以引入生产者消费者模型来实现生产者与消费者的解耦合,平衡生产能力与消费能力,从提升效率 3. 如何用
import time, random
from multiprocessing import Process, Queue def produer(name, food, q):
for i in range(3): # 生产的数量
res = '%s%s' % (food, i)
# 造数据
time.sleep(random.randint(1, 3)) # 模拟生产数据的时间
q.put(res)
print('厨师【%s】做了<%s>' % (name, res)) def consumer(name, q):
while True:
res = q.get()
if res is None: break # 生产者生产完后break退出
time.sleep(random.randint(1, 3)) # 模拟处理数据的时间
print('吃货【%s】吃了<%s>' % (name, res)) if __name__ == '__main__':
q = Queue()
# 生产者们
p1 = Process(target=produer, args=('小混世魔王', '包子', q))
p2 = Process(target=produer, args=('中混世魔王', '馒头', q))
p3 = Process(target=produer, args=('大混世魔王', '鸡蛋', q)) # 消费者们
c1 = Process(target=consumer, args=('扒皮', q))
c2 = Process(target=consumer, args=('钢牙', q)) p1.start()
p2.start()
p3.start()
c1.start()
c2.start()
print('主')
生产者消费者模型
存在问题
此时的问题是主进程永远不会结束,原因是:生产者p在生产完后就结束了,但是消费者c在取空了q之后,则一直处于死循环中且卡在q.get()这一步。
===>解决方式无非是让生产者在生产完毕后,往队列中再发一个结束信号,这样消费者在接收到结束信号后就可以break出死循环
import time, random
from multiprocessing import Process, Queue def produer(name, food, q):
for i in range(3): # 生产的数量
res = '%s%s' % (food, i)
# 造数据
time.sleep(random.randint(1, 3)) # 模拟生产数据的时间
q.put(res)
print('厨师【%s】做了<%s>' % (name, res)) def consumer(name, q):
while True:
res = q.get()
if res is None: break # 生产者生产完后break退出
time.sleep(random.randint(1, 3)) # 模拟处理数据的时间
print('吃货【%s】吃了<%s>' % (name, res)) if __name__ == '__main__':
q = Queue()
# 生产者们
p1 = Process(target=produer, args=('小混世魔王', '包子', q))
p2 = Process(target=produer, args=('中混世魔王', '馒头', q))
p3 = Process(target=produer, args=('大混世魔王', '鸡蛋', q)) # 消费者们
c1 = Process(target=consumer, args=('扒皮', q))
c2 = Process(target=consumer, args=('钢牙', q)) p1.start()
p2.start()
p3.start()
c1.start()
c2.start() p1.join()
p2.join()
p3.join() # 保证所有生产者生产完东西
q.put(None) # 所有生产者都生产完,在队列的最后加上None信号
q.put(None) # 给第二个消费者的信号
print('主')
解决方案一:
===>队列允许项目的使用者通知生成者项目已经被成功处理。通知进程是使用共享的信号和条件变量来实现的
import time, random
from multiprocessing import Process, JoinableQueue def produer(name, food, q):
for i in range(3): # 生产的数量
res = '%s%s' % (food, i)
# 造数据
time.sleep(random.randint(1, 3)) # 模拟生产数据的时间
q.put(res)
print('厨师【%s】做了<%s>' % (name, res)) def consumer(name, q):
while True:
res = q.get()
time.sleep(random.randint(1, 3)) # 模拟处理数据的时间
print('吃货【%s】吃了<%s>' % (name, res))
q.task_done() #向q.join()发送一次信号,证明一个数据已经被取走了 if __name__ == '__main__':
q = JoinableQueue()
# 生产者们
p1 = Process(target=produer, args=('小混世魔王', '包子', q))
p2 = Process(target=produer, args=('中混世魔王', '馒头', q))
p3 = Process(target=produer, args=('大混世魔王', '鸡蛋', q)) # 消费者们
c1 = Process(target=consumer, args=('扒皮', q))
c2 = Process(target=consumer, args=('钢牙', q)) p1.start()
p2.start()
p3.start()
c1.start()
c2.start() p1.join()
p2.join()
p3.join() # 队列取空
print('主')
解决方案二:
Python 35 进程间的通信(IPC机制)、生产者消费者模型的更多相关文章
- python网络编程--进程(方法和通信),锁, 队列,生产者消费者模型
1.进程 正在进行的一个过程或者说一个任务.负责执行任务的是cpu 进程(Process: 是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础.在 ...
- python并发编程之多进程(二):互斥锁(同步锁)&进程其他属性&进程间通信(queue)&生产者消费者模型
一,互斥锁,同步锁 进程之间数据不共享,但是共享同一套文件系统,所以访问同一个文件,或同一个打印终端,是没有问题的, 竞争带来的结果就是错乱,如何控制,就是加锁处理 part1:多个进程共享同一打印终 ...
- python开发进程:互斥锁(同步锁)&进程其他属性&进程间通信(queue)&生产者消费者模型
一,互斥锁,同步锁 进程之间数据不共享,但是共享同一套文件系统,所以访问同一个文件,或同一个打印终端,是没有问题的, 竞争带来的结果就是错乱,如何控制,就是加锁处理 part1:多个进程共享同一打印终 ...
- 网络编程基础----并发编程 ---守护进程----同步锁 lock-----IPC机制----生产者消费者模型
1 守护进程: 主进程 创建 守护进程 辅助主进程的运行 设置进程的 daemon属性 p1.daemon=True 1 守护进程会在主进程代码执行结束后就终止: 2 守护进程内无法再开启子进程 ...
- (并发编程)进程IPC,生产者消费者模型,守护进程补充
一.IPC(进程间通信)机制进程之间通信必须找到一种介质,该介质必须满足1.是所有进程共享的2.必须是内存空间附加:帮我们自动处理好锁的问题 a.from multiprocessing import ...
- 守护、互斥锁、IPC和生产者消费者模型
守护进程 主进程创建守护进程 其一:守护进程会在主进程代码执行结束后就终止 其二:守护进程内无法再开启子进程,否则抛出异常:AssertionError: daemonic processes are ...
- 守护模式,互斥锁,IPC通讯,生产者消费者模型
'''1,什么是生产者消费者模型 生产者:比喻的是程序中负责产生数据的任务 消费者:比喻的是程序中负责处理数据的任务 生产者->共享的介质(队列)<-消费者 2,为何用 实现了生产者与消费 ...
- 并发编程 - 进程 - 1.队列的使用/2.生产者消费者模型/3.JoinableQueue
1.队列的使用: 队列引用的前提: 多个进程对同一块共享数据的修改:要从硬盘读文件,慢,还要考虑上锁: 所以就出现了 队列 和 管道 都在内存中(快): 队列 = 管道 + 上锁 用队列的目的: 进程 ...
- 4、网络并发编程--僵尸进程、孤儿进程、守护进程、互斥锁、消息队列、IPC机制、生产者消费者模型、线程理论与实操
昨日内容回顾 操作系统发展史 1.穿孔卡片 CPU利用率极低 2.联机批处理系统 CPU效率有所提升 3.脱机批处理系统 CPU效率极大提升(现代计算机雏形) 多道技术(单核CPU) 串行:多个任务依 ...
随机推荐
- js 时间 Fri Dec 12 2014 08:00:00 GMT+0800
第一种var d = new Date('Fri Dec 12 2014 08:00:00 GMT+0800'); ) + '-' + d.getDate() + ' ' + d.getHours() ...
- mysql存储过程之遍历多表记录后插入第三方表中
自从学过存储过程后,就再也没有碰过存储过程,这是毕业后写的第一个存储过程. 因为项目里设备的种类比较多,分别存在不同的数据表中,java中对应不同的java bean对象,想要统一管理有点困难.最近正 ...
- Sping——使用注解创建切面
为讲解例子,我们首先定义一个Performance接口: package aoptest; public interface Performance { public void perform(); ...
- Bootstrap练习:可折叠下拉菜单
代码: <!DOCTYPE html> <html lang="zh-cn"> <head> <meta charset="UT ...
- PHP开发错误锦集(持续更新)
1.trait 命名问题. 问题:trait 里定义的方法找不到 <?php namespace app\controllers; trait Example { public function ...
- C#学习笔记_09_构造方法/函数
09_构造方法/函数 代码案例 作用:构造函数主要是用来创建对象时为对象赋初值来初始化对象:总与new运算符一起使用在创建对象的语句中,例如A a=new A(); 特点: 构造函数具有和类一样的名称 ...
- c# SQL事务
SQL事务执行 SqlTransaction sqlTransaction = sqlConnection.BeginTransaction(); SqlCommand sqlC ...
- BZOJ1192 鬼谷子的钱袋
没想到这是一道省选题... /* BZOJ1192 */ #include <cstdio> int main() { ; scanf("%d",&m); ;m ...
- Spell checker POJ 1035 字符串
Spell checker Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 25426 Accepted: 9300 De ...
- 完全卸载VS2015的方法
解压ISO文件夹,到根目录下运行命令行: vs_enterprise.exe /uninstall /force 注意:如果安装了Update 3时,就解压最新的ISO,不需要旧的. 卸载完成之后,删 ...