news 2026/9/3 5:08:37

Python进程间通信的2种实现方法(Queue和Pipe)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Python进程间通信的2种实现方法(Queue和Pipe)

讲解多线程之际, 介绍出达成线程间通信的三种机制, 同样还给出多种实现进程间通信的机制, 主要存在以下两种, 模块下的Queue类可供多个进程之间去得以实现。

在对多线程予以讲解之际, 介绍了三种达成线程间通信的机制, 同样地, 也给出了多种达成进程间通信的机制, 主要涵盖以下两种: 模块之下的Queue类, 给出了多个进程之间用以达成通信的诸多办法;Pipe, 又被称作“管道”, 常常被用于达成两个进程之间的通信, 这两个进程分别处于管道的两端。

在后续阶段那将会针对以上所提到的两种方式其相应的具体实现展开极为详尽的讲解。对于Queue实现进程间通信而言, 在之前已经讲解过运用Queue模块当中的Queue类去达成线程间通信, 然而若要实现进程间通信的话, 就需要运用模块当中的Queue类。

对于 Queue 实现进程间通信这种方式, 较为简易的理解是, 它运用了操作系统所开辟的一个用于队列的空间, 各个进程能够将数据放置到这个队列里, 并且, 也能够从队列之中把自身所需的信息取出来。

实现进程间通信具有诸多方法, 这些方法由 Queue 类提供, 表 1 所罗列的是常用的其中一些方法。

把表1中, Queue类常用的那个, 名为put(obj的方法名, 所具有的功能, 进行表述。

,block=True

,=None

将obj放进队列,当中倘若block参数被设为True时, 一旦队列被写满, 那么代码就会被阻塞, 直至有进程取走数据并腾出空间以供obj使用。参数用于设置阻塞的时间, 也就是程序最多在阻塞数秒之后, 如果依旧没有空闲空间, 那么程序会抛出queue.Full异常。(obj)此方法的功能等同于put(obj, False)。get。

block=True ,

=None

通过队列获取数据并加以返回, 当block取值为True且某值为None之际, 此方法会致使当前进程处于阻塞状态, 直至队列存有可使用的数据。要是将block设置为False, 进程会径直开展取数据的行为, 倘若取数据遭遇失败状况, 便会抛出queue.Empty异常(在此种情形下某参数将不产生作用)。若手动设定秒数, 当前进程在至多被阻塞该设定的秒数时长后, 要是届时仍旧未能取出可用的数据, 就会抛出queue.Empty异常。该方法的功能和 get(False) 是一样的。empty() 这个操作是用来判定当下队列空间是不是空的, 要是空的话, 那该方法就返回 True;反过来讲, 如果不是空的, 那就返回 False。

下面的程序, 进行了演示, 演示的内容是, 怎样去使用Queue类, 达成多进程相互之间通信的结果。

import multiprocessing def processFun(queue,name): print(multiprocessing.current_process().pid,"进程放数据:",name) #将 name 放入队列 queue.put(name) if __name__ == '__main__': # 创建进程通信的Queue queue = multiprocessing.Queue() # 创建子进程 process = multiprocessing.Process(target=processFun, args=(queue,"http://c.biancheng.net/python/")) # 启动子进程 process.start() #该子进程必须先执行完毕 process.join() print(multiprocessing.current_process().pid,"取数据:") print(queue.get())

程序执行结果为:

27100 进程放数据:

24188 取数据:

管或管道是 Pipe 直译过来的意思, Pipe 是实现进程间通信, 该种实现多进程编程的方式, 其和实际生活中的管即管道是非常类似的。通常情况下, 管道有两个口, 而 Pipe 也常被用于实现两个进程两两之间的通信, 这两个进程就是分别处于管道的两端, 一端是用作发送数据的, 另一端则是用来接收数据的。

要借助 Pipe 达成进程通信这件事儿, 起初, 得去调用那个.Pipe() 函数哩, 以此创造出一个管道, , 该函数用到的语法形式是下面这样的:

conn1, conn2 = .Pipe(

=True

当中, conn1以及conn2分别是用以接收Pipe函数返回的那2个端口的;参数其默认状态为True, 这意味着该管道是双向的, 也就是处于两个端口的进程, 既能进行数据发送, 又能实施数据收发, 然而要是把值设置成False, 那就表明管道是单向的, conn1仅仅能够用来接收数据, 并且conn2仅仅能够用来发送数据。

除此之外应值得提及的是, conn1属于对象, conn2属于对象, conn1能够调用表2所显示的这些方法, conn2能够调用表2所显示的这些方法。

表2中, Pipe对象能调用的方法众多, 其中, 方法名是send(obj)的这个方法, 其功能为发送一个obj给管道的另一端, 而另一端要使用recv()方法来接收才行。要知晓的是, 该obj必须是能够被序列化的, 要是该对象序列化之后超出了32MB, 那么很有可能就会引发异常。另外, 名为recv()的方法, 其作用是接收另一端借助send()方法发送过来的数据。还有close()方法, 它的功能是关闭连接。另外pol()方法, 它返回的是连接里是不是还有数据能够去读取。()方法则是用于发送字节数据的。要是没指定 、size 参数, 那默认发送 字节串之全部数据;要是指定了 和 size 参数, 那就只发送 字节串里从 起始、长度为 size 的字节数据。经由此方法发送的数据, 得用 () 或 方法去接收。

获取经由()方式传递过来的数据, 明确规定最多所能接收的字节数量。此方法会返回接收到的字节形式的数据。()具备的功能跟()方法相类似, 仅仅是该方法会把接收到的数据放置于 里面。

下面的程序, 进行了演示, 演示的内容为, 怎样去使用, 使用 Pipe 管道, 来实现, 实现 2 个进程, 之间通信。

import multiprocessing def processFun(conn,name): print(multiprocessing.current_process().pid,"进程发送数据:",name) conn.send(name) if __name__ == '__main__': #创建管道 conn1,conn2 = multiprocessing.Pipe() # 创建子进程 process = multiprocessing.Process(target=processFun, args=(conn1,"http://c.biancheng.net/python/")) # 启动子进程 process.start() process.join() print(multiprocessing.current_process().pid,"接收数据:") print(conn2.recv())

程序执行结果为:

28904 进程发送数据:

28880 接收数据:

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/3 5:08:22

HS32F0033的Time10配置

最近调试小控制器用到华芯的MCU,HS32F0033,奇怪的是在官网上查不到这颗料的信息。不过百度文心可以查的到:HS32F0033是苏州华芯微电子推出的一款基于ARM Cortex-M0内核的32位微控制器,最高运行主频可达24MHz,是面向工业…

作者头像 李华
网站建设 2026/9/3 5:06:42

Three.js与React构建3D骰子动画:Web前端交互式图形开发实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/3 5:04:19

RTX 4090散热模组压TEC:高性能散热跨界方案实战解析

1. 这篇文章真正要解决的问题 当“RTX4090”和“半导体制冷片”这两个词同时出现,很多人的第一反应可能是:这又是什么“科技狠活”?是给显卡超频的终极散热方案,还是DIY玩家的又一次疯狂实验? 实际上,这个…

作者头像 李华
网站建设 2026/9/3 5:04:14

Go Map 详解:键值对实际上是如何存储的

作者: 本文是对victoriametrics Go Maps Explained: How Key-Value Pairs Are Actually Stored的整理与翻译 发布日期:2024 年 8 月 16 日 阅读时间:17 分钟 分类: Go VictoriaMetrics开源技术 如果你刚开始接触 Go&#xff…

作者头像 李华
网站建设 2026/9/3 5:03:40

GWO优化RBF扩散速率的MATLAB实现与工程落地

简介:本资源是一套面向机器学习初学者与科研人员的MATLAB实战代码,聚焦于灰狼优化算法(GWO)与径向基函数神经网络(RBF)的融合建模,解决多变量输入下的回归预测问题,尤其适用于时间序…

作者头像 李华
网站建设 2026/9/3 5:01:37

MATLAB实现CNN手写汉字识别:从原理到实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华