如何用python实现——进程间通信IPC的主要方式?

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

计算机通信方式主要有如下几种,本文会详细介绍以下几种通信方式以及对应使用Python的实现方法,能够在学习理论的同时,也结合到Code层面,学以致用。

 

前言

每个进程的用户地址空间都是独立的,一般而言是不能互相访问的,但内核空间是每个进程都共享的,所以进程之间要通信必须通过内核。

如果大家在学习中遇到困难,想找一个python学习交流环境,可以加入我们的python圈,裙号930900780,可领取python学习资料,会节约很多时间,减少很多遇到的难题。

 

1.管道

如果你学过 Linux 命令,那你肯定很熟悉「|」这个竖线。

$ ps auxf | grep mysql

上面命令行里的「|」竖线就是一个管道,它的功能是将前一个命令(ps auxf)的输出,作为后一个命令(grep mysql)的输入,从这功能描述,可以看出管道传输数据是单向的,如果想相互通信,我们需要创建两个管道才行。

同时,我们得知上面这种管道是没有名字,所以「|」表示的管道称为匿名管道,用完了就销毁。

管道还有另外一个类型是命名管道,也被叫做 FIFO,因为数据是先进先出的传输方式。

在使用命名管道前,先需要通过 mkfifo 命令来创建,并且指定管道名字:

$ mkfifo myPipe

myPipe 就是这个管道的名称,基于 Linux 一切皆文件的理念,所以管道也是以文件的方式存在,我们可以用 ls 看一下,这个文件的类型是 p,也就是 pipe(管道) 的意思:

$ ls -l
prw-r--r--. 1 root    root         0 Jul 17 02:45 myPipe
复制代码

接下来,我们往 myPipe 这个管道写入数据:

$ echo "hello" > myPipe  // 将数据写进管道
                         // 停住了 ...
复制代码

你操作了后,你会发现命令执行后就停在这了,这是因为管道里的内容没有被读取,只有当管道里的数据被读完后,命令才可以正常退出。

于是,我们执行另外一个命令来读取这个管道里的数据:

$ cat < myPipe  // 读取管道里的数据
hello
复制代码

可以看到,管道里的内容被读取出来了,并打印在了终端上,另外一方面,echo 那个命令也正常退出了。

我们可以看出,管道这种通信方式效率低,不适合进程间频繁地交换数据。当然,它的好处,自然就是简单,同时也我们很容易得知管道里的数据已经被另一个进程读取了。

那管道如何创建呢,背后原理是什么?

匿名管道的创建,需要通过下面这个系统调用:

int pipe(int fd[2])
复制代码

这里表示创建一个匿名管道,并返回了两个描述符,一个是管道的读取端描述符 fd[0],另一个是管道的写入端描述符 fd[1]。注意,这个匿名管道是特殊的文件,只存在于内存,不存于文件系统中。

 

其实,所谓的管道,就是内核里面的一串缓存。从管道的一段写入的数据,实际上是缓存在内核中的,另一端读取,也就是从内核中读取这段数据。另外,管道传输的数据是无格式的流且大小受限。

看到这,你可能会有疑问了,这两个描述符都是在一个进程里面,并没有起到进程间通信的作用,怎么样才能使得管道是跨过两个进程的呢?

我们可以使用 fork 创建子进程,创建的子进程会复制父进程的文件描述符,这样就做到了两个进程各有两个「 fd[0] 与 fd[1]」,两个进程就可以通过各自的 fd 写入和读取同一个管道文件实现跨进程通信了。

 

管道只能一端写入,另一端读出,所以上面这种模式容易造成混乱,因为父进程和子进程都可以同时写入,也都可以读出。那么,为了避免这种情况,通常的做法是:

  • 父进程关闭读取的 fd[0],只保留写入的 fd[1];
  • 子进程关闭写入的 fd[1],只保留读取的 fd[0];

 

所以说如果需要双向通信,则应该创建两个管道。

到这里,我们仅仅解析了使用管道进行父进程与子进程之间的通信,但是在我们 shell 里面并不是这样的。

在 shell 里面执行 A | B命令的时候,A 进程和 B 进程都是 shell 创建出来的子进程,A 和 B 之间不存在父子关系,它俩的父进程都是 shell。

 

所以说,在 shell 里通过「|」匿名管道将多个命令连接在一起,实际上也就是创建了多个子进程,那么在我们编写 shell 脚本时,能使用一个管道搞定的事情,就不要多用一个管道,这样可以减少创建子进程的系统开销。

我们可以得知,对于匿名管道,它的通信范围是存在父子关系的进程。因为管道没有实体,也就是没有管道文件,只能通过 fork 来复制父进程 fd 文件描述符,来达到通信的目的。

另外,对于命名管道,它可以在不相关的进程间也能相互通信。因为命令管道,提前创建了一个类型为管道的设备文件,在进程里只要使用这个设备文件,就可以相互通信。

不管是匿名管道还是命名管道,进程写入的数据都是缓存在内核中,另一个进程读取数据时候自然也是从内核中获取,同时通信数据都遵循先进先出原则,不支持 lseek 之类的文件定位操作。

1.1 Python实现

1.1.1 使用os模块中的fork

QA测试开发工程师面试题满分问答23:(干货)线程通信和进程通信 进程间通信(Inter-Process Communication,IPC)是指不同进程之间进行数据交换和信息共享的机制。在现代操作系统中,进程间通信是非常重要的,因为它允许不同的进程协同工作、共享资源和完成复杂的任务。以下是几种常见的进程间通信方式:管道(Pipe):管道是一种半双工的通信方式,可以在父进程和子进程之间传递数据。它适用于具有亲缘关系的进程,如父子进程之间的通信。管道可以是匿名管道(在父子进程间创建)或命名管道(允许无关进程之间的通信)。 阅读详情

相关推荐

Python进程间通信(IPC)几种方式总结

起源: 在项目中单进程无法满足需求时,可能 多进程是一种解决方案, 但是进程间在 需要相互沟通交流协作的时候 就需要进程间能够相互通信; 进程间通信方式: 共享内存: 多个进程间 共享一块内存区域,进程间向此内存区域 读写数据,从而完成数据共享,进而完成进程间通信; 这块内存区域支持的数据类型如下:list,dict,Namespace,Lock,RLock,Semaphore,BoundedSemaphore,Condition,Event,Barrier,Queu...

rgc_520_zyl的博客 3414

Python教程:一文了解Python进程间通信

Python 中,进程间通信(Inter-Process Communication,IPC)是指两个或多个进程之间进行数据交换和共享信息的过程。由于每个进程都有自己独立的内存空间,因此不同进程之间不能直接访问彼此的内存。

旦莫的博客 2730

Python 进程间通信IPC)的几种方式解析

Python 提供了多种进程间通信方式,每种方式都有其特定的应用场景。选择合适的 IPC 机制可以提高程序的效率和可维护性。在实际开发中,应根据具体的需求和环境选择最适合的 IPC 方法。```

2501_91229547的博客 455

Python 多进程通信的桥梁:使用 IPC 机制实现数据共享

模块是 Python 并发编程的重要组成部分,尤其适用于处理计算密集型任务。通过合理地使用多进程、进程间通信和进程同步机制,我们可以编写出高效、可靠的并发程序。希望本文能够帮助读者更好地理解和应用 Python 的多进程编程。如果你的程序瓶颈是CPU密集型计算,那么使用将会是一个很好的选择。

铭渊老黄 161

并发编程之进程间通信

目录 并发编程之进程间通信 进程间通信--管道(multiprocessing.Pipe) 进程间通信--队列(multiprocessing.Queue) 队列的基础用法: 代码实例 生产者消费者模型 为什么要使用生产者...

weixin_30660027的博客 339

凉了!张三同学没答好「进程间通信」,被面试官挂了....

前言 开场小故事 炎炎夏日,张三骑着单车去面试花了 1 小时,一路上汗流浃背。 结果面试过程只花了 5 分钟就结束了,面完的时候,天还是依然是亮的,还得在烈日下奔波 1 小时回去。 面试五分钟,骑车两小时。 你看,张三因面试没准备好,吹空调的时间只有 5 分钟,来回路上花了 2 小时晒太阳,你说惨不惨? 所以啊,炎炎夏日,为了能延长吹空调的时间,我们应该在面试前准备得更充分些,吹空调时间是要自己争取的。 很明显,在这一场面试中, 张三在进程间通信这一块没复习好,虽然列出了进程间通信方式,但这只是..

小林coding 1万+

Python 中的进程间通信

Python 中,进程之间无法直接共享数据,因为每个进程都有独立的内存空间。本文将详细介绍 Python 中几种常见的 IPC 方式,并结合实际场景说明它们的适用场景、原理、具体实现以及需要考虑的异常处理等细节。然而,由于每个进程独立运行,并且拥有自己独立的内存空间,它们无法像线程那样直接共享数据。:适用于需要在多个进程之间频繁传递数据的场景,如生产者-消费者模式。:适用于两个进程之间的直接通信,特别是需要快速、简单的数据传输时。:适合需要频繁、高速共享数据的场景,如多进程计算中的数组或矩阵。

pumpkin84514的博客 1586

python通信方式_进程间通信IPC主要方式有哪些?大佬教你用python实现

计算机通信方式主要有如下几种,本文会详细介绍以下几种通信方式以及对应使用Python实现方法,能够在学习理论的同时,也结合到Code层面,学以致用。​前言每个进程的用户地址空间都是独立的,一般而言是不能互相访问的,但内核空间是每个进程都共享的,所以进程之间要通信必须通过内核。如果大家在学习中遇到困难,想找一个python学习交流环境,可以加入我们的python圈,裙号930900780,可领取p...

weixin_39621488的博客 218

Python并发编程—进程间通信

进程间通信IPC) 1.必要性: 进程间空间独立,资源不共享,此时在需要进程间数据传输时就需要特定的手段进行数据通信。 2.常用进程间通信方法:管道通信、消息队列、共享内存、信号量 管道通信(Pipe) 1.通信原理:在内存中开辟管道空间,生成管道操作对象,多个进程使用同一个管道对象进行读写即可实现通信 2.实现方法 from multiprocessing import Pipe ...

weixin_30892987的博客 126

IPC :进程之间的通信

IPC :进程之间的通信   1.管道(pipe)     1.1 特点:       两边都可以进出       数据不安全     1.2 方法:        form multiprocessing import Pipe left,right = Pipe() #创造一个管子 left.send() # 从左边放入 right.revc() # 从右边拿出 ...

weixin_30537391的博客 75

pythonipo模型包括_python全栈开发基础【第二十一篇】互斥锁以及进程之间的三种通信方式IPC)以及生产者个消费者模型...

一、互斥锁进程之间数据隔离,但是共享一套文件系统,因而可以通过文件来实现进程直接的通信,但问题是必须自己加锁处理。注意:加锁的目的是为了保证多个进程修改同一块数据时,同一时间只能有一个修改,即串行的修改,没错,速度是慢了,牺牲了速度而保证了数据安全。1.上厕所的小例子:你上厕所的时候肯定得锁门吧,有人来了看见门锁着,就会在外面等着,等你吧门开开出来的时候,下一个人才去上厕所。from multip...

weixin_39900608的博客 245

【软件设计师考点】进程间的通信

进程间通信作为操作系统中实现多进程协同工作的关键技术,在现代计算机系统中扮演着不可或缺的角色。从简单的管道通信到高效的共享内存,再到灵活的套接字通信,每一种进程间通信方式都有其独特的优势和适用场景 。在实际的软件开发和系统设计中,我们需要根据具体的需求和场景,综合考虑通信效率、数据量大小、进程关系、实时性要求等因素,选择最合适的进程间通信方式

大雨淅淅的博客 794

多进程/多线程间通信与同步

进程通信方式一Queue: # coding=utf-8from multiprocessing import Queue, Processimport random def getter(name, queue):  print 'Son process %s' % name   while True:     try:       val...

dhbek48884的专栏 217

一文读懂Python进程间通信的几种方式

为什么进程之间需要通信? 1.数据传输 一个进程需要将它的数据发送给另一个进程; 2.资源共享 多个进程之间共享同样的资源; 3.事件通知 一个进程需要向另一个或一组进程发送消息,通知它们发生了某种事件; 4.进程控制 有些进程希望完全控制另一个进程的执行(如Debug进程),该控制进程希望能够拦截另一个进程的所有操作,并能够及时知道它的状态改变。 基于以上的几个原因,所以就有了进程间通信的概念,那我们应该如何进行进程之间的通信呢? 进程间通信的原理 每个进程各自有不同的用户地址空间,任何一个进程的全局变量

吃果冻不吐果冻皮 8121

IPC进程间通信)详解

场景推荐 IPC 方式编辑器插件(如 VSCode LSP)stdio或socket网络服务(浏览器通信)WebSocketHTTPsocket容器间通信socket或高速大数据通信semaphore简单脚本交互pipe或stdioIPC实现多进程协作的核心机制。不同 IPC 方式适配不同场景:性能、同步、跨主机是主要考量维度。在前后端协作、服务编排、本地 AI 工具调用中,IPC 是不可或缺的基础设施。

HGX-DJK 1427

进程间通信(IPC)之消息队列

漫谈进程间通信之消息队列,进程通信家族中不可或缺的一员。交流学习,共同进步。

Xiao__Tian__的博客 6844
上一篇: 100 个 Python 小例子(基于 Python3)下篇
下一篇: 如何用Python Tkinter实现剪刀石头布小游戏?
python小丸子
博客等级 码龄6年 30粉丝 24原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值