python学习笔记——multiprocessing 多进程组件 Pipe管道
进程间通信(IPC InterProcess Communication)是值在不同进程间传播或交换信息。
IPC通过有管道(无名管道 和 有名 / 命名管道)、消息队列、共享存储 / 内容、信号量、套接字socket、streams,其中socket和streams支持不同主机上的两个进程间通信
1 管道Pipe的基本语法
管道Pipe是multiprocessing中的方法Pipe(),也即multiprocessing.Pipe()
multiprocessing.Pipe([duplex])
功能:创建管道对象
参数:可选参数,
如果不设置参数,表示默认True,此时为全双工通信;
如果设置为False,则表示单向通信,也即一个返回值只能接受,第二个返回值只能发送
返回值:返回两个值,表示管道的两端,一端调用send发送消息,一端调用recv接受消息
注意:管道必须有发送端和接受端,不能只有单端;
无发送端,有接受端,会阻塞在recv,程序无法结束
有发送端,无接受端,程序可以结束,但没有msg消息
特点:
1)半双工(即数据只能在一个方向上流动)时具有固定的读端和写端。
2)只能用于具有亲缘关系的进程之间的通信(也是父子进程或者兄弟进程之间)。
3)它可以看成是一种特殊的文件,对于它的读写也可以使用普通的read、write 等函数。但是它不是普通的文件,并不属于其他任何文件系统,并且只存在于内存中。
2 应用实例
from multiprocessing import Process,Pipe import time import os child,parent = Pipe()#默认为True,全双工,false时为单向通信 def fun(name): time.sleep(1) child.send('hello' + str(name))#将send中的内容发送出去 # parent.send('hello' + str(name))#将child位置变换一下,双工条件下依然正常运行 print(os.getppid(),"--------",os.getpid()) return jobs = [] for i in range(5): p = Process(target= fun, args=(i,)) jobs.append(p) p.start() for n in range(5): print(parent.recv())#用于接受send发送的mag # print(child.recv())#将parent位置变换一下,双工条件下依然正常运行 for j in jobs: j.join()#[1,2,3,4,5]在这些编号中如果1号进程没结束,2号进程也没结束,首先内核先记录2号,阻塞1号,待1号结束后,再执行2号,但是这些编号中没有先后顺序
运行
2809 ------ 2810 hello0 2809 ------ 2811 2809 ------ 2812 hello1 hello2 2809 ------ 2814 hello4 2809 ------ 2813 hello3 ***********************
注意:5个进程执行时没有时间顺序
实例2
import multiprocessing import time def proc1(pipe): while True: for i in range(10000): print("send: %s" %(i)) pipe.send(i) time.sleep(1) def proc2(pipe): while True: print("proc2 rev:", pipe.recv()) time.sleep(1) def proc3(pipe): while True: print("proc3 rev:", pipe.recv()) time.sleep(1) if __name__ == "__main__": pipe = multiprocessing.Pipe() p1 = multiprocessing.Process(target=proc1, args=(pipe[0],)) p2 = multiprocessing.Process(target=proc2, args=(pipe[1],)) #p3 = multiprocessing.Process(target=proc3, args=(pipe[1],)) p1.start() p2.start() #p3.start() p1.join() p2.join() #p3.join()
运行
send: 0 proc2 rev: 0 send: 1 proc2 rev: 1 send: 2 proc2 rev: 2 send: 3 proc2 rev: 3 send: 4 proc2 rev: 4 ...
实例2参考:
python中multiprocessing模块之Pipe管道
Python 3 利用 subprocess 实现管道( pipe )交互操作读/写通信
python学习笔记——multiprocessing 多进程组件 Pipe管道的更多相关文章
- python学习笔记——multiprocessing 多进程组件-队列Queue
1 消息队列 1.1 基本语法 消息队列:multiprocessing.Queue,Queue是对进程安全的队列,可以使用Queue实现对进程之间的数据传输:还有一个重要作用是作为缓存使用. Que ...
- python学习笔记——multiprocessing 多进程组件 进程池Pool
1 进程池Pool基本概述 在使用Python进行系统管理时,特别是同时操作多个文件目录或者远程控制多台主机,并行操作可以节约大量时间,如果操作的对象数目不大时,还可以直接适用Process类动态生成 ...
- python学习笔记——multiprocessing 多进程模块Process
系统自带的fork模块创建的多进程是基于Linux或Unix平台的,而window平台并不支持: python中的multiprocess为跨平台版本的多进程模块,支持子进程.通信和共享数据.执行不同 ...
- python学习笔记——multiprocessing 多进程中的重构方法__init__
重构: import multiprocessing import time class ClockProcesses(multiprocessing.Process): def __init__(s ...
- python学习笔记之四-多进程&多线程&异步非阻塞
ProcessPoolExecutor对multiprocessing进行了高级抽象,暴露出简单的统一接口. 异步非阻塞 爬虫 对于异步IO请求的本质则是[非阻塞Socket]+[IO多路复用]: & ...
- Python学习笔记进阶篇——总览
Python学习笔记——进阶篇[第八周]———进程.线程.协程篇(Socket编程进阶&多线程.多进程) Python学习笔记——进阶篇[第八周]———进程.线程.协程篇(异常处理) Pyth ...
- Python学习笔记(十一)
Python学习笔记(十一): 生成器,迭代器回顾 模块 作业-计算器 1. 生成器,迭代器回顾 1. 列表生成式:[x for x in range(10)] 2. 生成器 (generator o ...
- Python学习笔记九
Python学习笔记之九 为什么要有操作系统 管理硬件,提供接口. 管理调度进程,并且将多个进程对硬件的竞争变得有序. 操作系统发展史 第一代计算机:真空管和穿孔卡片 没有操作系统,所有的程序设计直接 ...
- Python学习笔记,day5
Python学习笔记,day5 一.time & datetime模块 import本质为将要导入的模块,先解释一遍 #_*_coding:utf-8_*_ __author__ = 'Ale ...
随机推荐
- java之 22天 GUI 图形界面编程(二)
转自:http://takeme.iteye.com/blog/1876853 模拟window开打文件 import java.awt.Button; import java.awt.Dialog; ...
- 附1 rabbitmq常用命令
1.rabbitmq的启动和停止 rabbitmq-server (前台启动) rabbitmq-server -detached(后台启动) rabbitmqctl stop(停止) 2.查看rab ...
- Eclipse上传代码到GitHub
平时工作学习中难免会在Github搜索一下开源的Android代码, Android系统本身的代码就是托管在GitHub上,如果平时随手做了一个Demo,托管在云盘感觉不入流,如果平时自己一时兴起写了 ...
- maven mvn Failed during checkstyle execution
maven 命令默认强制使用checkstyle, 造成 命令运行失败 并报错: Failed during checkstyle execution 关闭checkstyle,命令如下: mvn [ ...
- tp 生成静态页
$this->fetch()返回的是html 可以直接写入到HTML文件内生成静态页
- 为什么好多人说win8不好用?
2012年8月就開始接触win8了,那时win8已经出来半年了:自从用了win8之后就感觉他比xp.win7桌面更绚丽.我就喜欢绚丽的桌面.至今使用win8已经两年了,可发现身边好多人都说win8不好 ...
- 【Nodejs】“快算24”扑克牌游戏算法
算24是一款扑克牌游戏,它的游戏方式是把四张牌的牌面数值通过四则运算得到结果24,四张牌必须仅用一次.这是一种挺好的锻炼孩子算数能力的扑克牌游戏. 各地玩法还有点差别,有的只算1-10,其它抽出来:有 ...
- linux下的tar命令
tar 命令在打包的时候如果是通过绝对路径压缩打包,在不特殊参数时,解压时会在当前路径下创建打包时的路径,并提示警告: tar: Removing leading `/' from member na ...
- windows、linux mysql部署
阅读目录: 1.Windows下安装MySQL 2.Linux下安装MySQL 序章: MySQL是个小型的数据库,用来自己做小项目,做学习练习什么的再适合不过了,不过新手总会被一些莫名奇妙的问题难住 ...
- hdu1874 畅通project续(求最短路径)
畅通project续 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total ...