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()

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

  1. Linux父进程如何发信号给子进程,在父进程和子进程之间发送信号

    我正试图从parrent进程向子进程发送一个用户定义的(SIGUSR1或SIGUSR2)信号.子进程接收到信号后,会等待5秒钟,并将另一个用户定义的信号发送给parrent进程.当parrent进程接 ...

  2. Electron中主进程和渲染进程之间的通信

    文章目录 进程间通信 内容介绍 Demo:渲染进程到主进程的异步通信 其他 进程间通信 内容介绍 Electron 进程间通信 - 掘金 - weblnRun Electron开发实战 - P10进程 ...

  3. python主进程 子进程_pool主进程捕获子进程异常

    问题背景: 主进程做任务调度,子进程做任务执行,子进程定时返回进度信息,主进程获取进度,进度为100时,子进程任务结束.子进程执行过程中如果有异常,主进程需要捕获 python多进程调度, 主进程如何 ...

  4. 主进程、子进程和守护进程

    理解 主进程main thread: 程序执行的入口,可以理解为常用的main 函数. 父进程parent thread: 对于子进程而言, 子进程的创造者,可有多个子进程. 任何进程都有父进程,追根 ...

  5. 父进程和子进程之间的关系

    在程序设计时,某一个具体的功能模块可以通过函数或是线程等不同的形式来实现.对于同一进程而言,这些函数.线程都是存在于同一个地址空间下的,而且在执行时,大多只对与其相关的一些数据进行处理.如果算法存在某 ...

  6. python进程的注意点(进程之间不共享全局变量、主进程会等待所有的子进程执行结束再结束)

    1. 进程的注意点介绍 进程之间不共享全局变量 主进程会等待所有的子进程执行结束再结束 2. 进程之间不共享全局变量 import multiprocessing import time# 定义全局变 ...

  7. python主进程退出时子进程也退出_主进程被杀死时,如何保证子进程同时退出,而不变为孤儿进程(三)...

    之前两篇文章讨论了进程意外退出时,如何杀死子进程,这节我们研究下在使用进程池multiprocessing.Pool时,如何保证主进程意外退出,进程池中的worker进程同时退出,不产生孤儿进程.如果 ...

  8. multiprocessing python_Python多线程/进程(threading、multiprocessing)知识覆盖详解

    你好,我是goldsunC 让我们一起进步吧! 基本知识 在Python中有一个全局解释器锁GIL(Global Interpreter Lock).GIL源于Python设计之初的考虑,目的是使数据 ...

  9. python启动多个进程_Python程序中的进程操作--—--开启多进程

    Python程序中的进程操作-----开启多进程 之前我们已经了解了很多进程相关的理论知识,了解进程是什么应该不再困难了,刚刚我们已经了解了,运行中的程序就是一个进程.所有的进程都是通过它的父进程来创 ...

最新文章

  1. 运用Kubernetes进行分布式负载测试
  2. Python中的Numpy(4.矩阵操作(算数运算,矩阵积,广播机制))
  3. [转]蓝牙基带数据传输机理分析
  4. 电脑怎么测试硬盘的读写速度_两块硬盘合二为一,电脑读写翻倍?这样的“好事”你必须得了解...
  5. 自动化集成:Pipeline整合Docker容器
  6. 数据算法之折半查找(binSearch)的Java实现
  7. LeetCode 49. Group Anagrams
  8. RJ45网线接口详解
  9. 什么是m叉树_品读 | 记忆深处那些树
  10. OpenLDAP+freeradius+samba+802.1x实现无线和有线网络认证+动态vlan下发——openLDAP篇
  11. CH583/CH579蓝牙智能遥控器方案
  12. adb连接小米电视,尝试去除开机广告失败补救方法
  13. IT运维工作到底是做什么的?
  14. outlook导出邮件(.msg)读取和解析
  15. 自动驾驶技术(2)--智能车辆导航技术概述
  16. WI-FI模块ESP8266(针对初学者)
  17. zip、rar压缩文件密码破解——使用ARCHPR Professional Edition
  18. 从 0 到 1 学习 elasticsearch ,这一篇就够了!(建议收藏)
  19. 需求的获取:需求调研中的5W+1H定律
  20. Android Studio 创建.json 文件,个人调取json文件代码。

热门文章

  1. 翠香猕猴桃 和 薄皮核桃,快来下单
  2. [开源] .Net ORM FreeSql 1.8.0-preview 最新动态播报
  3. asp.net core 3.x Endpoint终结点路由1-基本介绍和使用
  4. 面对万物互联的智能世界,你是否也想分一杯羹
  5. 定了!10 月 8 日!Jupyter Notebook 原生支持将正式来到 VS Code!
  6. .NET开发框架(九)-NLB网络负载平衡配置实战(视频)
  7. 不装 VS 自己编译安装 Windows Terminal
  8. 如何向微软 Docs 和本地化社区提交翻译贡献
  9. C# 函数式编程:LINQ
  10. .NetCore Cap 结合 RabbitMQ 实现消息订阅