python多进程之IPC机制以及生产者消费者模型
1.进程间通信(IPC机制)
第一种:管道
import subprocess
res=subprocess.Popen('dir',shell=True,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE)
第二种:队列=管道+锁
注:队列占用的是内存的大小,不应该放大数据,应该放一些简单的消息
from multiprocessing import Queue
q=Queue()
q.put(['a'],block=True,timeout=3) block默认为True,队列满时锁住,如果三秒之后队列还是满的,会抛出异常
q.put({'a':1},block=True,timeout=3)
q.put('a',block=True,timeout=3)
q.put_nowait(1)等同于q.put(1,block=False) 队列满时直接抛出异常,不会再等
prite(q.get(block=True,timeout=3))从队列中取值,队列中没有值等3秒,之后还没值会抛出异常
prite(q.get_nowait())从队列中取值,如果没有值,直接抛出异常 2.生产者消费者模型
1. 什么是生产者消费者模型
生产者:代指生产数据的任务
消费者:代指处理数据的任务
该模型的工作方式:
生产生产数据传递消费者处理 实现方式:
生产者---->队列<------消费者 2. 为何要用
当程序中出现明细的两类任务,一类负责生产数据,一类负责处理数据
就可以引入生产者消费者模型来实现生产者与消费者的解耦合,平衡生产能力与消费能力,从提升效率
3.如何用:
第一种:
from multiprocessing import Queue,Process
import time,random
def Producer(name,food,p):
for i in range(1,3):
res='%s%s'%(food,i)
time.sleep(random.randint(1,3))
p.put(res)
print('厨师%s做了<%s>'%(name,res))
def consumer(name,p):
while True:
res=p.get()
if res==None:break #从队列中去到None时,结束循环
time.sleep(random.randint(1,3))
print('大傻逼%s吃了<%s>..............'%(name,res))
if __name__ == '__main__':
q=Queue()
p1=Process(target=Producer,args=('lmj','水',q))
p2=Process(target=Producer,args=('lmj2','包子',q))
p3=Process(target=Producer,args=('lmj3','汤',q))
c1=Process(target=consumer,args=('lbz',q))
c2=Process(target=consumer,args=('lmz',q))
p1.start()
p2.start()
p3.start()
c1.start()
c2.start()
p1.join() #用join方法保证生产者生产完毕
p2.join()
p3.join()
q.put(None) #生产完毕后向队列中丢入两个None,两个消费者拿到之后就会停止
q.put(None)
print('master')
import time,random
from multiprocessing import Process,JoinableQueue def producer(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=producer,args=('小','水',q))
p2=Process(target=producer,args=('中','包子',q))
p3=Process(target=producer,args=('大','汤',q))
# 消费者们
c1=Process(target=consumer,args=('1',q))
c2=Process(target=consumer,args=('2',q))
c1.daemon=True #将消费者设置成主进程的守护进程,主进程一旦结束,消费者也会结束
c2.daemon=True p1.start()
p2.start()
p3.start()
c1.start()
c2.start() p1.join()
p2.join()
p3.join()
q.join() # 此时生产者不会再往队列里面添加东西,统计队列里还剩多少值.主进程等q结束,即q内数据被取干净了
print('主')
执行结果:
厨师[小]生产了<水0>
厨师[中]生产了<包子0>
厨师[大]生产了<汤0>
厨师[大]生产了<汤1>
吃货[2]吃了<水0>
厨师[小]生产了<水1>
吃货[1]吃了<包子0>
厨师[中]生产了<包子1>
厨师[小]生产了<水2>
厨师[中]生产了<包子2>
吃货[2]吃了<汤0>
厨师[大]生产了<汤2>
吃货[1]吃了<汤1>
吃货[2]吃了<水1>
吃货[1]吃了<包子1>
吃货[2]吃了<水2>
吃货[1]吃了<包子2>
吃货[2]吃了<汤2>
主
python多进程之IPC机制以及生产者消费者模型的更多相关文章
- 进程部分(IPC机制及生产者消费者模型)和线程部分
进程部分 一:进程间通信IPC机制:由于进程之间的内存空间是相互隔离的,所以为了进程间的通信需要一个共享的内存空间, 但是共享带来的问题是数据在写的时候就不安全了,所以需要一种机制既有能共享的内存 空 ...
- 进程间通信IPC机制和生产者消费者模型
1.由于进程之间内存隔离,那么要修改共享数据时可以利用IPC机制 我们利用队列去处理相应数据 #管道 #队列=管道+锁 from multiprocessing import Queue # q=Qu ...
- 4、网络并发编程--僵尸进程、孤儿进程、守护进程、互斥锁、消息队列、IPC机制、生产者消费者模型、线程理论与实操
昨日内容回顾 操作系统发展史 1.穿孔卡片 CPU利用率极低 2.联机批处理系统 CPU效率有所提升 3.脱机批处理系统 CPU效率极大提升(现代计算机雏形) 多道技术(单核CPU) 串行:多个任务依 ...
- IPC机制和生产者消费者模型
IPC机制:(解决进程间的数据隔离问题) 进程间通信:IPC(inter-Process Comminication) 创建共享的进程列队,Queue 是多进程的安全列队,可以使用Queue 实现多进 ...
- python并发编程-进程间通信-Queue队列使用-生产者消费者模型-线程理论-创建及对象属性方法-线程互斥锁-守护线程-02
目录 进程补充 进程通信前言 Queue队列的基本使用 通过Queue队列实现进程间通信(IPC机制) 生产者消费者模型 以做包子买包子为例实现当包子卖完了停止消费行为 线程 什么是线程 为什么要有线 ...
- Python之网路编程之-互斥锁与进程间的通信(IPC)及生产者消费者模型
一.互斥锁 进程之间数据隔离,但是共享一套文件系统,因而可以通过文件来实现进程直接的通信,但问题是必须自己加锁处理. 注意:加锁的目的是为了保证多个进程修改同一块数据时,同一时间只能有一个修改,即串行 ...
- 4月25日 python学习总结 互斥锁 IPC通信 和 生产者消费者模型
一.守护进程 import random import time from multiprocessing import Process def task(): print('name: egon') ...
- 【python】-- 队列(Queue)、生产者消费者模型
队列(Queue) 在多个线程之间安全的交换数据信息,队列在多线程编程中特别有用 队列的好处: 提高双方的效率,你只需要把数据放到队列中,中间去干别的事情. 完成了程序的解耦性,两者关系依赖性没有不大 ...
- Python 第九篇:队列Queue、生产者消费者模型、(IO/异步IP/Select/Poll/Epool)、Mysql操作
Mysql操作: grant select,insert,update,delete on *.* to root@"%" Identified by "123456&q ...
随机推荐
- PHP使用redis防止大并发下二次写入
php调用redis进去读写操作,大并发下会出现:读取key1,没有内容则写入内容,但是大并发下会出现同时多个php进程写入的情况,这个时候需要加一个锁,即获取锁的php进程有权限写. $lock_k ...
- java学习——内部类(一)
内部类 把一个类放在另一个类中定义,这个定义在其他内部的类被称为内部类,包含内部类 的类被成为外部类,Java从JDK1.1开始引入了内部类的定义. 内部类的作用: 内部类提供了更好的封装,可以把内部 ...
- MyBatis从入门到精通(第9章):Spring集成MyBatis(上)
MyBatis从入门到精通(第9章):Spring集成MyBatis(上) Spring是一个为了解决企业级Web应用开发过程中面临的复杂性,而被创建的一个非常流行的轻量级框架. mybatis-sp ...
- Mybatis配置文件无故报错、无自动完成提示的解决方法,及自动生成主要配置项
1.引子 Mybatis配置文件显示红叉有错误,而实际检查又没有错误,这是因为开发环境不能识别这种类型的xml文件.要解决这个问题,就要让IDE开发环境能够“认识”这个文件类型,我们要让IDE环境将这 ...
- Data总结
getTime() 方法可返回距 1970 年 1 月 1 日之间的毫秒数 var d = new Date(); var n = d.getTime(); //一长串数字
- Python Numpy中数据的常用的保存与读取方法
在经常性读取大量的数值文件时(比如深度学习训练数据),可以考虑现将数据存储为Numpy格式,然后直接使用Numpy去读取,速度相比为转化前快很多. 下面就常用的保存数据到二进制文件和保存数据到文本文件 ...
- 协议(Protocol)
协议(Protocol)的基本概念 协议的声明看起来比较类似于Java中一个类的接口,但是和接口不同的是:协议没有父类也不能定义实例变量. 协议是一种特殊的程序设计结构,用于声明专门被别的类实现的方法 ...
- 图之强连通--Tarjan算法
强连通分量 简介 在阅读下列内容之前,请务必了解图论基础部分. 强连通的定义是:有向图 G 强连通是指,G 中任意两个结点连通. 强连通分量(Strongly Connected Components ...
- Codeforces Round #517 (Div. 2)(1~n的分配)
题:https://codeforces.com/contest/1072/problem/C 思路:首先找到最大的x,使得x*(x+1)/2 <= a+b 那么一定存在一种分割使得 a1 &l ...
- Java复习(一)——Java语言概述、开发环境、基础知识
设计模式:在各种应用系统中被大量应用,是设计的“常用套路” 作为Java WEB开发人员,需要掌握HTML/CSS/JS和数据库相关知识 常用的应用程序框架:Spring MVC,Spring Boo ...