MultiProcessing中主进程与子进程之间通过管道(Pipe)通信

Python 中 Multiprocessing 实现进程通信

    • 1. 如何建立主进程与子进程之间的通信管道?
    • 2. 为什么一定要将Pipe中的某些端close()?

本文参考自:python 学习笔记 - Queue & Pipes,进程间通讯

1. 如何建立主进程与子进程之间的通信管道?

在Python中很多时候需要用到多进程并行编程,由于每个进程都拥有自己的独立内存空间,无法像线程一样通过访问全局变量来共享数据。因此,进程之间的通信比线程通信要更加的复杂。在 Multiprocessing 包中存在 Pipe 类,Pipe(管道)能够实现进程之间更高效的通信,倘若我们现在由一个主进程,主进程创建了一个子进程,那么如何通过建立主进程与子进程之间的通信呢?

  • 当主进程创建Pipe的时候,Pipe的两个Connections连接的都是主进程;
  • 当主进程创建子进程后,Connections被拷贝了一份,此时一共有2(主进程)+ 2(子进程)= 4 个Connections;
  • 随后,我们关闭主进程中的 out_connection 和子进程中的 in_connection 端口,即可建立一条主进程通往子进程的管道了;

NOTE: in_connectionout_connection 中的 in/out 是针对 Pipe 管道来说的,in 是指数据流入Pipe的那条管道。此外,由于 Pipe 对象默认是双向的,因此下图中的箭头管道上的数据流实际上可以是双向的,既能从上往下也能从下往上。

实现代码如下所示:

from multiprocessing import Pipe, Processdef son_process(x, pipe):""" 注意,out在前,in在后 """_out_pipe, _in_pipe = pipe""" 关闭拷贝过来的输入端 """_in_pipe.close()while True:try:msg = _out_pipe.recv()print msgexcept EOFError:""" 当out_pipe接受不到输出的时候且输入被关闭的时候,会抛出EORFError,可以捕获并且退出子进程 """breakif __name__ == '__main__':out_pipe, in_pipe = Pipe(True)son_p = Process(target=son_process, args=(100, (out_pipe, in_pipe)))son_p.start()""" 等pipe被拷贝后,关闭主进程的输出端,这样,创建的Pipe一端连接着主进程的输入,一端连接着子进程的输出口 """out_pipe.close()for x in range(1000):in_pipe.send(x)in_pipe.close()son_p.join()print("主进程结束")

2. 为什么一定要将Pipe中的某些端close()?

由于Pipe之间的通信时通过,in_conn.send()、out_conn.recv() 这种方式进行通信的,因此如果当某一方调用了 .recv() 函数但一直没有另外的端口使用 .send() 方法的话,recv() 函数就会阻塞住。为了避免程序阻塞,我们在明确另一个端口不会再调用 .send() 函数后可以直接将发送端口给 close(),这样以来如果接收端还在继续调用 .recv() 方法的话程序就会抛出 EOFError 的异常,示例代码如下:

from multiprocessing import Process
from multiprocessing import Pipe
import os
import timedef send(out_conn):out_conn.send("hello")""" 发完一次内容后,就将子进程中的 out_conn 给 close(),注意外部(主进程中)的 out_conn 也需要被 close """out_conn.close() def recv(in_conn):try:print(in_conn.recv())print(in_conn.recv())		# 第二次调用 .recv() 会抛出 EOFError 异常,因为 out_conn 已经被关闭了except EOFError:print("end")if __name__ == "__main__":out_conn, in_conn = Pipe(True)p_send = Process(target=send, args=(out_conn,))p_send.start()p_recv = Process(target=recv, args=(in_conn,))p_recv.start()out_conn.close()  				# 在子进程拷贝完 Pipe Connections 之后,外部的 out_conn 也需要被关闭p_send.join()p_recv.join()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/290323.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何为 .NET 项目自定义强制代码样式规则

前言每个人都有自己的代码样式习惯:命名约定、大括号、空格、换行等。但是,作为一个团队来说,应该使用同样的代码样式规则。这样可以有效减少编译器的警告/建议,保证阅读代码的人员理解一致。今天我们介绍一种为单独的 .NET 项目定义代码样式…

C和指针之字符操作(<ctype.h>)

1、字符操作 在头文件<ctype.h>中 1、字符分类 islower(int a) 是否是小写 isupper(int a) 是否是大写 2、字符转换 int tolower(int ch)转换成小写 int woupper(int ch)转换成大写 2、测试Demo #include <stdio.h> #include <ctype.h>int m…

零拷贝概念 -- linux内核

零拷贝&#xff08;zero-copy&#xff09; 备快速网络接口的主要技术。零拷贝技术通过降低或消除关键通信路径影响速率的操作&#xff0c;降低传输数据的操作系统开销和协议处理开销&#xff0c;从而有效提高通信性能&#xff0c;实现快速传输数据。 零拷贝技术能够降低数据拷贝…

我是如何帮助创业公司改进企业工作的

前段时间在一家创业公司实习&#xff0c;几十个人的团队&#xff0c;正处在规模逐渐扩大的阶段&#xff0c;但是整个公司的协作工作和日常管理却越来越麻烦&#xff0c;鉴于我以前对Saas和协作平台都有过一点研究&#xff0c;于是leader叫我去找一个“简单&#xff0c;好用&…

PHP单例模式(精讲)

2019独角兽企业重金招聘Python工程师标准>>> 首先我们要明确单例模式这个概念&#xff0c;那么什么是单例模式呢&#xff1f; 单例模式顾名思义&#xff0c;就是只有一个实例。作为对象的创建模式&#xff0c;单例模式确保某一个类只有一个实例&#xff0c;而且自行…

【QMIX】一种基于Value-Based多智能体算法

文章目录1. QMIX 解决了什么问题&#xff08;Motivation&#xff09;2. QMIX 怎样解决团队收益最大化问题&#xff08;Method&#xff09;2.1 算法大框架 —— 基于 AC 框架的 CTDE&#xff08;Centralized Training Distributed Execution&#xff09; 模式2.2 Agent RNN Netw…

增强型的for循环linkedlist_LinkedList的复习

先摘选一段Testpublic void test_LinkedList() { // 初始化100万数据 List list new LinkedList(1000000);// 遍历求和int sum 0;for (int i 0; i sum list.get(i); }}乍一看可能觉得没什么问题&#xff0c;但是这个遍历求和会非常慢。主要因为链表的数据结构…

linux之用echo输入数据到文本末尾以及用open ssl命令在证书文件里面获取公钥

1、用echo输入数据到文本末尾 我们知道清空一个文本快速的方法如下 echo "" > file 我们可以用echo输入数字到文本末尾&#xff0c;记住是 >> echo "hello word" >> file 2、如果用open ssl命令在证书文件里面提取公钥 证书文件内容要记…

3月更新来了!Windows 11正式版22000.556发布

面向 Windows 11 正式版用户&#xff0c;微软现已发布累积更新 KB5011493&#xff0c;更新后版本号升级至 Build 22000.556。主要变化1.微软正在改变 Windows 11 "开始"菜单中推荐模块有关 Office 文件的打开方式。如果文件被同步到 OneDrive&#xff0c;“开始”菜单…

[C/C++]重读《The C Programming Language》

第一次读这本书的时候是大三初&#xff0c;现在打算重读一遍&#xff01;。 第一章 导言 1. 学习一门新程序设计语言的唯一途径就是用它来写程序。 2. 每个程序都从main函数的起点开始执行。 3. 在C语言中&#xff0c;所有变量必须先声明后使用。 4. C语言中的基本数据类型的大…

Max Points on a Line

Given n points on a 2D plane, find the maximum number of points that lie on the same straight line. 参考&#xff1a;http://blog.csdn.net/doc_sgl/article/details/17103427 AC的代码&#xff1a; #include<iostream> #include<map> #include<vector&g…

115怎么利用sha1下载东西_618“甩”度娘,拥抱115,体验和价格才是王道

网盘价钱​前天618&#xff0c;圈子里的朋友几乎都“甩”了度娘一巴掌&#xff0c;我才知道115搞活动&#xff0c;由原来500元1年的钻石会员&#xff0c;变成500元3年&#xff0c;算起来每天不到0.5元&#xff0c;确实比度娘实惠了很多&#xff0c;而且活动持续到6月底。自从发…

安装宝塔面板

安装宝塔面板&#xff1a; 1. 宝塔面板网站&#xff1a; https://www.bt.cn/ 2.安装教程 https://www.bt.cn/bbs/thread-1186-1-1.html 3.1 使用远程工具连接执行以下命令 yum install -y wget && wget -O install.sh http://download.bt.cn/install/install.sh &&…

C和指针之字符串编程练习1

1、问题 //编写一个程序,从标准的输入读取一些字符,并统计下各类字符所占的百分比 //控制字符、空白字符、数字、小写字母、大写字母、标点符号、不可打印的字符 2、代码实现 #include <stdio.h> #include <ctype.h>//编写一个程序,从标准的输入读取一些字符,…

【COMA】一种将团队回报拆分为独立回报的多智能体算法

文章目录1. COMA 解决了什么问题&#xff08;Motivation&#xff09;2. COMA 怎么解决独立回报分配问题&#xff08;Method&#xff09;2.1 核心思想 counterfactual baseline 的提出2.2 算法大框架 —— 基于 AC 框架的 CTDE&#xff08;Centralized Training Distributed Exe…

C#解析Markdown文档,实现替换图片链接操作

前言又是好久没写博客了其实也不是没写&#xff0c;是最近在「做一个博客」&#xff0c;从2月21日开始&#xff0c;大概一个多星期的时间&#xff0c;疯狂刷进度&#xff0c;边写代码边写了一整系列的博客开发笔记&#xff0c;目前为止已经写了16篇了&#xff0c;然后上3月之后…

LoadRunner测试下载功能点脚本(方法一)

性能需求&#xff1a;对系统某页面中&#xff0c;点击下载功能做并发测试&#xff0c;以获取在并发下载文件的情况下系统的性能指标。 备注&#xff1a;页面上点击下载时的文件可以是word、excel、pdf等。 问题1&#xff1a;录制完下载的场景后&#xff0c;发现脚本里面并没有包…

海南橡胶机器人成本_「图说」海垦看点:海南橡胶联合北京理工华汇智能科技首创我国林间智能割胶机器人...

1 海垦南繁产业集团长期以来高度重视改善职工居住条件&#xff0c;于去年启动了海燕队保障性住房项目&#xff0c;项目建成后将有效解决职工住房问题。图为近日正在加紧施工的建设工地。 蒙胜国 摄2 海南橡胶联合北京理工华汇智能科技有限公司&#xff0c;研发出来的最新一代林…

C和指针之字符串编程练习10(判断字符串是否是回文数)

1、问题 //如果参数字符串是个回文,函数就返回真,否则返回假。回文就是指一个字符串从左向右和从右向左读是一样的。函数应该忽略所有的非字母字符,而且在进行字符比较时不用区分大小写。 2、代码实现 #include <stdio.h> #include <ctype.h>//如果参数字符串是…

数据挖掘在轨迹信息上的应用实验

文章目录1. 实验概览2. 数据集下载3. 数据预处理3.1 异常点去除3.2 停留点检测与环绕点检测3.3 轨迹分段4. 基于轨迹信息的数据挖掘4.1 路口检测4.1.1 地图分割与轨迹点速度计算4.2 偏好学习通常&#xff0c;我们将一个连续的GPS信号点序列称为一个轨迹&#xff08;Trajectory&…