这里先简述一下进程之间为什么要进行通信

我们要知道进程是资源分配的基本单位,不同进程之间的资源是独立的,没有关联,不能在一个进程中直接访问另一个进程资源

进程间通信的目的

  • 数据传输:一个进程需要将他的数据发送给另一个进程
  • 资源共享:多个进程之间共享同样的资源
  • 通知时间:一个进程需要向另一个进程发送消息,通知它们本进程发生了什么事情(如进程终止时要通知父进程)
  • 进程控制:有些进程希望完全控制另一个进程的执行(如 Debug 进程),此时控制进程希望能够拦截另一个进程的所有陷入和异常,并能够及时知道它的状态改变。

Python中主要提供了两种进程间通信的方式

  1. multiprocessing模块下的Queue类提供了多个进程之间通信的方法
  2. pipe 管道,常用于实现2个进程间通信,这两个进程分别位于管道的两端

Queue实现进程间通信

Queue 实现进程间通信的方式,就是使用了操作系统给开辟的一个队列空间,各个进程可以把数据放到该队列中,当然也可以从队列中把自己需要的信息取走。

  • put( obj[ ,block=True [ ,timeout=None ] ] ) 将 obj 放入队列,其中当 block 参数设为 True 时,一旦队列被写满,则代码就会被阻塞,直到有进程取走数据并腾出空间供 obj 使用。timeout 参数用来设置阻塞的时间,即程序最多在阻塞 timeout 秒之后,如果还是没有空闲空间,则程序会抛出 queue.Full 异常。
  • empty() 判断当前队列空间是否为空,如果为空,则该方法返回 True;反之,返回 False。
  • get([block=True , [timeout=None] ]) 从队列中取数据并返回,当 block 为 True 且 timeout 为 None 时,该方法会阻塞当前进程,直到队列中有可用的数据。如果 block 设为 False,则进程会直接做取数据的操作,如果取数据失败,则抛出 queue.Empty 异常(这种情形下 timeout 参数将不起作用)。如果手动 timeout 秒数,则当前进程最多被阻塞 timeout 秒,如果到时依旧没有可用的数据取出,则会抛出 queue.Empty 异常。

示例
使用队列实现进程之间的信息通信

import os
import multiprocessing
def test(queue,name):#获取当前子进程编号print("子进程编号:", os.getpid())print(multiprocessing.current_process().pid,"往子进程中放数据:",name)#将 name 放入队列queue.put(name)
if __name__ == '__main__':# 创建进程通信的Queuequeue = multiprocessing.Queue()# 获取当前进程的编号print("主进程编号:", os.getpid())# 创建子进程process = multiprocessing.Process(target=test, args=(queue,"jibu"))# 启动子进程process.start()#进程等待,该子进程必须先执行完毕process.join()print(multiprocessing.current_process().pid,"主进程从子进程中取数据:")print(queue.get())结果
主进程编号: 15888
子进程编号: 18044
18044 往子进程中放数据: jibu
15888 主进程从子进程中取数据:
jibu

Pipe实现进程间通信

Pipe管道有 2 个口,而 Pipe 也常用来实现 2 个进程之间的通信,这 2 个进程分别位于管道的两端,一端用来发送数据,另一端用来接收数据。

使用 Pipe 实现进程通信,首先需要调用 multiprocessing.Pipe() 函数来创建一个管道。该函数的语法格式如下:

conn1, conn2 = multiprocessing.Pipe( [duplex=True] )

其中,conn1 和 conn2 分别用来接收 Pipe 函数返回的 2 个端口;duplex 参数默认为 True,表示该管道是双向的,即位于 2 个端口的进程既可以发送数据,也可以接受数据,而如果将 duplex 值设为 False,则表示管道是单向的,conn1 只能用来接收数据,而 conn2 只能用来发送数据。

Pipe可调用方法

  • send(obj) 发送一个 obj 给管道的另一端,另一端使用 recv() 方法接收。需要说明的是,该 obj 必须是可序列化的,如果该对象序列化之后超过 32MB,则很可能会引发 ValueError 异常。
  • recv() 接收另一端通过 send() 方法发送过来的数据。
  • close() 关闭连接。
  • poll([timeout]) 返回连接中是否还有数据可以读取。
import os
import multiprocessing
def test(conn,name):# 获取当前子进程编号print("子进程编号:", os.getpid())print(multiprocessing.current_process().pid,"子进程发送数据:",name)conn.send(name)
if __name__ == '__main__':# 获取当前进程的编号print("主进程编号:", os.getpid())#创建管道conn1,conn2 = multiprocessing.Pipe()# 创建子进程process = multiprocessing.Process(target=test, args=(conn1,"jibu"))# 启动子进程process.start()process.join()print(multiprocessing.current_process().pid,"主进程接收数据:")print(conn2.recv())结果
主进程编号: 13848
子进程编号: 19208
19208 子进程发送数据: jibu
13848 主进程接收数据:
jibu

Python 进程间的通信相关推荐

  1. python多进程间通信_Python 多进程编程之 进程间的通信(Queue)

    Python 多进程编程之 进程间的通信(Queue) 1,进程间通信 Process有时是需要通信的,操作系统提供了很多机制来实现进程之间的通信,而Queue就是其中的一个方法 ----这是操作系统 ...

  2. python进程间通信时间开销_python 进程间的通信

    python3,进程间的通信 本文来源于python 3.5版本的官方文档 multiprocessing模块为进程间通信提供了两种方法: 1.进程队列queue The Queue class is ...

  3. python3,进程间的通信

    本文来源于python 3.5版本的官方文档 multiprocessing模块为进程间通信提供了两种方法: 1.进程队列queue The Queue class is a near clone o ...

  4. linux+Qt 下利用D-Bus进行进程间高效通信的三种方式

    linux+Qt 下利用D-Bus进行进程间高效通信的三种方式 原文链接: https://www.cnblogs.com/wwang/archive/2010/10/27/1862552.html ...

  5. 同步线程和进程间的通信

    最近回去学习了一下进程和进程间的通信,有时候很多东西久不看了也就一下子忘了== 这里面有好几个互斥对象使用线程的 1 void mListText(CString str) 2 { 3 m_list_ ...

  6. Android 使用AIDL实现进程间的通信

    在Android中,如果我们需要在不同进程间实现通信,就需要用到AIDL技术去完成. AIDL(android Interface Definition Language)是一种接口定义语言,编译器通 ...

  7. 【转载】进程间的通信之剪贴板方法实现源码

    1 源码无私奉献 2 3 void CClipboardDlg::OnBnClickedButton1() 4 { 5 // TODO: 在此添加控件通知处理程序代码 6 //打开剪贴板 7 if(O ...

  8. 进程间的通信IPC(无名管道和命名管道)

    进程间的通信IPC介绍 进程间通信(IPC,InterProcess Communication)是指在不同进程之间传播或交换信息. IPC的方式通常有管道(包括无名管道和命名管道).消息队列.信号量 ...

  9. Linux系统编程(三)进程间的通信

    Linux系统编程(三)进程间的通信 一.为什么需要进程之间的通信(IPC)? 二.管道 1.概念 2.特质 3.原理 4.局限性 5.代码 2.读入数据 三.共享存储映射 注意事项 父子进程通信 一 ...

最新文章

  1. Windows任务计划创建计划,定时执行PowerShell命令
  2. 《他其实没那么喜欢你》经典台词(4)
  3. delete hive_「挑战30万年薪」 Hive语句详解之从SQL到HQL的应转习惯
  4. jquery.timers使用说明
  5. python学习笔记(十 三)、网络编程
  6. k1658停运_最新通知!福州这些列车停运!
  7. java设计模式之备忘_[译]Java 设计模式之备忘录
  8. [转载]一个发生在亚洲服务器上的真实故事!
  9. 搭建迁移训练Slim框架环境
  10. 翻译「C++ Rvalue References Explained」C++右值引用详解 Part3:右值引用
  11. 探讨OSPF次优路由选择
  12. 个人财务管理系统,Excel记账表格分享
  13. 抢注小程序“诱饵”多 轻信者被“套路”
  14. 计算机人类的三大科学思维,什么是科学思维:科学思维可以分为理论、实验、计算思维...
  15. 蝴蝶效应,青蛙现象,鳄鱼法则,鲇鱼效应,羊群效...
  16. D-Tale,实现Pandas GUI高效数据分析
  17. NS2中GOD的使用
  18. scratch和python怎么读_Python如何像scratch一样朗读文字?|python3教程|python入门|python教程...
  19. 保健用品行业智慧供应链管理系统:高度整合产业链资源,精细化企业供应商管理
  20. 网站内嵌百度地图定向到公司位置

热门文章

  1. python伪随机数模块random详解
  2. 2018已经很冷,2019年Android工作或更难找—,30分钟轻松入门flutter
  3. 电能减去热能计算机械能,力与运动机械能热能计算题
  4. 谷歌地图-Google Map
  5. 数学基础 - 线性空间(Vector Space)
  6. Oracle(三)常用的查询语句
  7. 快捷键-vscode-excel
  8. Flask中'endpoint'(端点)的理解
  9. VS2008试用版破解方法
  10. iOS - navigationController简单使用