python多进程通信实例分析

发布时间:2026/9/2 5:25:26

python多进程通信实例分析
多进程通信实例分析操作系统会给每一个创建而成的进程赋予一个独立的地址空间, 不同进程对应的地址空间是全然隔离的, 所以要是不附加其他措施, 它们压根感觉不到彼此的存在。那么进程之间究竟要怎样去完成通信? 它们之间的关联到底是怎样的? 其实现原理又是什么? 本文于是借助相对简单的方式来聊一下进程之间的通信一事。依旧是那句表述, 原理是相同的, 期望能够透过具体的例子去体会一下里面本质性的内容。向下, 尽可能以简易的形式, 去分别介绍一下每一种通信方式, 具体的详细内容能够参照文档来加以使用。管道先瞧一瞧那最为简单、年代久远有着的一种 IPC, 它是管道。一般所讲的是无名管道, 从本质层面而言可以视作一种文件, 仅仅存在于内存里, 不会进行存盘。不同的进程借助系统所给予的接口去朝着管道之中读取或者写入数据。也就意味着, 我们借助这样一种中间介质, 来给进程提供交流途径。无名管道的局限性在于, 通常仅用于存在直接关联关系的父子进程。下面通过一个简单事例, 来看一下它的用法。复制代码from , Pipedef (pname, conn):conn.send(Datasubprocess) print(conn.recv()) # Dataparentprocessif name :conn1, conn2 Pipe(True) sub_proc Process(targetpstart, args(subprocess, conn2)) sub_proc.start() print (conn1.recv()) # Datasubprocess conn1.send(Dataparentprocess) sub_proc.join()复制代码管道通信三步曲创建Pipe得到两个对象conn1和conn2父进程持有conn1将conn2传递给子进程父进程与子进程, 凭借对所持有对象开展send操作以及recv操作, 从而达成数据传递以及接受的目的。前边我们所构建的是全双工管道, 同样能够构建半双工管道, 其具体的运用能够参照官网的描述。具名管道FIFO呈现在上面所介绍的那些管道, 其主要用途是针对存在直接关联关系的进程, 然而, 该管道的局限性相对而言是比较大的。接下来, 让我们一同去瞧一瞧那种能够在任意进程之间展开通信的具名管道。是因为平台之上os模块不存在属性呀, 所以呢这个例子仅仅能够在linux上去运行测试环境为7, 版本是2.7.5。复制代码!/usr/bin/os, timefrom ./pipe.in ./pipe.outdef ():if os.path.exists(input_pipe): os.remove(input_pipe) if os.path.exists(output_pipe): os.remove(output_pipe) os.mkfifo(output_pipe) os.mkfifo(input_pipe) in1 os.open(input_pipe, os.O_RDONLY) # read from pipe.in out1 os.open(output_pipe, os.O_SYNC | os.O_CREAT | os.O_RDWR) while True: read_data os.read(in1, 1024) print(received data from pipe.in: %s consumer % read_data) if len(read_data) 0: time.sleep(1) continue if exit in read_data: break os.write(out1, read_data) os.close(in1) os.close(out1)def ():in2 None out2 os.open(input_pipe, os.O_SYNC | os.O_CREAT | os.O_RDWR) for i in range(1, 4): msg msg str(i) len_send os.write(out2, msg) print(------product msg: %s by producer------ % msg) if in2 is None: in2 os.open(output_pipe, os.O_RDONLY) # read from pipe.out data os.read(in2, 1024) if len(data) 0: break print(received data from pipe.out: %s producer % data) time.sleep(1) os.write(out2, exit) os.close(in2) os.close(out2)if name :pconsumer Process(targetconsumer, args()) pproducer Process(targetproducer, args()) pconsumer.start() time.sleep(0.5) pproducer.start() pconsumer.join() pproducer.join()复制代码运行流程如下每一轮的过程如下进程往pipe.in文件中写入消息数据进程从pipe.in文件中读入消息数据进程往pipe.out文件中写入回执消息数据进程从pipe.out文件中读出回执消息数据结果如下View Code存在两个进程, 它们之间不存在直接的关系。其中每个进程, 都分别有一个用于读文件的操作, 以及一个用于写文件的操作。假若是这样的情况, 若两个进程的读写文件存在关联, 那么它们便能够进行通信。消息队列Queue往队列里添加数据, 或者从队列里获取数据, 进程借此来传递消息数据。这是个简单的例子。复制代码from , Queuetimedef (que):for product in (Orange, Apple, ): print(put product: %s to queue % product) que.put(product) time.sleep(0.5) res que.get() print(consumer result: %s % res)def (que):while True: product que.get() print(get product:%s from queue % product) que.put(suc!) time.sleep(0.5) if not product: breakif name :que Queue(1) p Process(targetproducer, args(que)) c Process(targetconsumer, args(que,)) p.start() c.start() p.join() c.join()复制代码这个例子比较简单queue的具体用法可以参考一下官网。结果View Code这里有几点需要注意下能够对队列的容量予以指定, 要是出现超出所指定容量的情况, 便会产生异常, 这种异常为: raise Full。默认put和get均会阻塞当前进程设若put未被设定成处于阻塞状态, 那么存在这样一种可能性, 即自身从中队列里取出由自身放置进去的数据。共享内存共享内存, 是一种常用的通信方式, 用于进程之间, 它具备高效的特点, 而为了确保共享内存能够被有序访问, 针对进程方面, 有必要采取额外的同步措施。下面的这一个例子, 只是单纯简单地演示了, 在其中怎样于不同进程之间, 运用共享内存去进行通信呢。复制代码frommmaptimedef ():with contextlib.closing(mmap.mmap(-1, 1024, tagnamecnblogs, accessmmap.ACCESS_WRITE)) as mem: for share_data in (Hello, Alpha_Panda): mem.seek(0) print(Write data: %s to share memory! % share_data) mem.write(str.encode(share_data)) mem.flush() time.sleep(0.5)def ():while True: invalid_byte, empty_byte str.encode(\x00), str.encode() with contextlib.closing(mmap.mmap(-1, 1024, tagnamecnblogs, accessmmap.ACCESS_READ)) as mem: share_data mem.read(1024).replace(invalid_byte, empty_byte) if not share_data: 当共享内存没有有效数据时结束reader break print(Get data: %s from share memory! % share_data.decode()) time.sleep(0.5)if name :p_reader Process(targetreader, args()) p_writer Process(targetwriter, args()) p_writer.start() p_reader.start() p_writer.join() p_reader.join()复制代码执行结果写数据, 等于, 向分享, 问好, 等于, 要分享Write data: to share !获取数据, 等于, 来自共享的, “你好”Get data: from share !下面简单的来说明一下共享内存的原理进程虚拟地址到物理地址的一个映射关如下上面这个图已经很明白的展示了共享内存的原理。其一, 于正常状况之下, 不同进程的线性地址空间会被映射至各异的物理内存页, 其二, 如此方式之下, 无论其他进程怎样对物理内存予以修改, 其三, 皆不会对其他进程产生影响。在进程共享内存情形下, 右边所呈现的是, 不同进程的部分线性地址会被映射至同一物理页, 而一旦有一个进程针对此物理页作出修改, 那么对于另一个进程而言将会立即可见。之所以说潜在的问题即必然要采取进程同步措施, 是因为此对于共享内存的访问是必须达成互斥状态的结果。这一点能够通过借助信号量这一方式来予以实现。通信最后再来介绍一种可以跨主机的进程间通信。对于那些知晓网络编程的人而言, 针对这个理应都相对熟悉, 不但能够在不同主机之间开展通信, 甚至某些时候能够运用于同一主机里不同进程之间来进行通信。就这一部分代码而言, 都是相对简单且常见的, 在此处只是单纯运用流程图去把通信的流程以及相关接口给呈现出来。某个进程、在客户端之上、使用着, 服务器之上、监听程序、与之进行通信, 这样的一个流程、被上图所表示。小结这里针对常见的进程间通信相关概念, 进行了简单介绍, 这里针对常见的进程间通信相关实例, 也进行了简单介绍。期望本文能够使得你对于进程间通信拥有一个更为深入的理解, 期望本文能够使得你对于进程间通信拥有一个更为深入的认识。结合之前几篇, 有对线程概念的介绍, 有对进程概念的介绍, 还有对线程间同步一些措施的介绍, 相信应该对线程和进程相关概念, 有一个简单清晰的认识了。原文地址

相关新闻

MNP-XH16A电机核评测与集成指南:从FOC控制到机器人关节驱动实践

MNP-XH16A电机核评测与集成指南:从FOC控制到机器人关节驱动实践

2026/9/2 5:25:26

这次我们来看一个名为“高级评测电机核 MNP-XH16A 三国典韦”的项目。从标题来看,这很可能是一个与硬件评测、电机控制或特定型号的电机核心模块相关的技术内容。虽然“三国典韦”的命名颇具创意,暗示了其性能或定位的强悍,但核心焦点应落在“…

孩子胃口差挑食补锌到底管不管用?8款补锌剂真实体验告诉你结果

孩子胃口差挑食补锌到底管不管用?8款补锌剂真实体验告诉你结果

2026/9/2 5:25:26

一、娃吃饭像打仗、见饭就躲,补锌到底管不管用?——一个被饭点气哭的家长提问 第一个误区:补锌是开胃药。锌补的是味觉消化底子,对饭菜单一、零食塞满的娃作用有限,别指望一条下去狼吞虎咽。 第二个误区:…

S32K144 CAN FD实战:基于S32KDS与SDK3.0的FlexCAN例程详解

S32K144 CAN FD实战:基于S32KDS与SDK3.0的FlexCAN例程详解

2026/9/2 5:25:26

简介:基于S32KDS平台与SDK 3.0构建的FlexCAN组件CAN FD测试例程,面向NXP S32K系列汽车电子开发者,用于验证经典CAN向CAN FD快速通信升级时的驱动配置与数据收发逻辑。例程覆盖FlexCAN初始化、位时间参数调整、多邮箱管理、64字节长帧传输、中…

计算机毕业设计之基于GIS的旅游信息管理系统设计与实现

计算机毕业设计之基于GIS的旅游信息管理系统设计与实现

2026/9/2 6:25:29

本系统为用户而设计制作旅游信息管理系统,旨在实现旅游信息智能化、现代化管理。本旅游信息管理自动化系统的开发和研制的最终目的是将旅游信息的运作模式从手工记录数据转变为网络信息查询管理,从而为现代管理人员的使用提供更多的便利和条件。使旅游信…

TVA具身智能架构:TVA-World跨时域因果涌现新范式

TVA具身智能架构:TVA-World跨时域因果涌现新范式

2026/9/2 6:25:29

前沿技术探索:TVA智能体(简称TVA) TVA智能体(亦称“AI智能体视觉”或“TVA视觉智能体”)是依托Transformer架构与“因式智能体”理论构建的通用视觉技术体系。它有机融合深度强化学习(DRL)、卷…

神笔智媒|小红书数据采集助手:从网页采集到飞书多维表格

神笔智媒|小红书数据采集助手:从网页采集到飞书多维表格

2026/9/2 6:25:29

为什么做这个扩展做内容运营、竞品分析或市场研究时,经常需要整理小红书公开数据:在博主主页记录昵称、账号、粉丝数据和主页链接;整理博主主页中的笔记标题、互动数据、发布时间和笔记链接;进入笔记详情页,收集评论和…

从 FAQ 到 AI 机器人:搭建 WhatsApp 私有知识库的完整思路

从 FAQ 到 AI 机器人:搭建 WhatsApp 私有知识库的完整思路

2026/9/2 6:25:29

把几十份产品文档上传给大模型,并不等于拥有了一个可靠的客服或销售机器人。真正困难的部分,是让它知道应该引用哪条知识、什么时候不能回答,以及答案出错后由谁修正。FAQ 和 AI 机器人之间,还隔着一套系统 传统 FAQ 是给人阅读的…

2026 年给 AI 面试模拟的 5 个高质量提问模板——从「帮我模拟面试」到真正有用的每一次练习

2026 年给 AI 面试模拟的 5 个高质量提问模板——从「帮我模拟面试」到真正有用的每一次练习

2026/9/2 6:25:29

文章目录一、「帮我模拟面试」为什么是最低效的输入二、5 个高质量 Prompt 模板(核心章节)模板 1:结构诊断模式——「我不知道自己答得差在哪」模板 2:抗压追问模式——「我背了答案,但一被追问就崩」模板 3&#xff1…

MiniMax H3接入Twitch:无限生成视频的工程化拆解

MiniMax H3接入Twitch:无限生成视频的工程化拆解

2026/9/2 6:15:28

最近,MiniMax H3 接入 Twitch 直播、无限生成视频这个话题,开始在视频生成和直播运维两个圈子里同时被讨论。如果你只看标题,会觉得这是一个特别酷的方案:本地部署一个视频生成模型,然后让它 7x24 小时不间断生成画面&…

备战数据库管理工程师校招:索引、事务、备份恢复核心考点解析

备战数据库管理工程师校招:索引、事务、备份恢复核心考点解析

2026/9/1 1:53:39

每年校招季我都会接触不少准备数据库方向笔试的同学,看到最多的状态就是:简历上写着“熟悉 MySQL”“了解索引优化”,一碰到数据库管理工程师的笔试卷,却在索引、事务、锁、备份恢复这些题目上翻车。网易这套 2018 校园招聘数据库…

数字电路时序基石:深入理解建立时间与保持时间

数字电路时序基石:深入理解建立时间与保持时间

2026/9/1 9:55:14

1. 这不是“背公式”的事:时间参数到底在约束什么你翻过数字电路教材,一定见过这两个词:建立时间(Setup Time)和保持时间(Hold Time)。它们常被并列写在触发器(Flip-Flop&#xff09…

蓝桥杯国赛超声波测距机:从单片机原理到嵌入式系统实战

蓝桥杯国赛超声波测距机:从单片机原理到嵌入式系统实战

2026/9/1 23:49:08

1. 项目缘起:从赛题到超声波测距机的诞生第八届蓝桥杯单片机设计与开发国赛的题目,我至今记忆犹新。它没有直接给出一个花哨的名字,而是用“超声波测距机”这个朴实无华的功能描述,精准地勾勒出了考核的核心。对于当时备赛的我而言…

单片机毕业设计-基于单片机与蓝牙通讯的输液状态监测终端设计与开发 基于 STM32 或 51 单片机的液位‑滴速‑温度多参数输液监护装置设计(024005)

单片机毕业设计-基于单片机与蓝牙通讯的输液状态监测终端设计与开发 基于 STM32 或 51 单片机的液位‑滴速‑温度多参数输液监护装置设计(024005)

2026/9/2 0:04:59

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于嵌入式单片机,Java、小程序技术领域和毕业项目实战 ✌️…

DeepSeek字幕翻译实战:从API调用到批量SRT转中文的完整方案

DeepSeek字幕翻译实战:从API调用到批量SRT转中文的完整方案

2026/9/2 0:04:59

这次我们来看一个很实用的 DeepSeek 落地场景:用 DeepSeek 把英文视频字幕自动翻译成中文。具体案例是《恶魔君》1989 年第 28 集的英转中字幕任务,标题写得很直白,但背后其实是一整套可以复用的技术流程:字幕解析、模型调用、批量…

用Python搭建搞笑语音助手:从语音识别到语音合成全教程

用Python搭建搞笑语音助手:从语音识别到语音合成全教程

2026/9/2 0:04:59

当你家里摆着一台天猫精灵,却总希望语音助手偶尔“不正经”一点,不用官方腔回答问题,而是张口就接几句搞笑段子,会是什么体验?我最近动手验证了一下这个想法——没有去改装任何市面上现有的智能音箱,而是直…

远程协作的工作台整理

远程协作的工作台整理

2026/9/2 6:21:32

远程协作的工作台整理远程协作的核心不是再加一个工具,而是让交接信息足够完整。异步任务要写明目标、输入位置、完成标准和需要决策的人。 工作台的最小配置 将日程、待办、代码和沟通入口收拢到少数固定位置;通知按紧急程度分层。工作台不需要模仿办公…

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

2026/9/2 6:21:32

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

2026/9/2 2:45:06

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…