进程通信
【一】进程通信
【1】什么是进程间通信
- 进程间通信(Inter-Process Communication, IPC)是指两个或多个进程之间进行信息交换的过程
- 它是一种计算机编程技术,用于在不同进程之间共享数据和资源。
【2】如何实现进程间通信
- 借助于消息队列,进程可以将消息放入队列中,然后由另一个进程从队列中取出。
- 这种通信方式是非阻塞的,即发送进程不要等待接收进程的响应即可继续执行。
- multiprocessing模块支持两种形式:队列和管道,两种方式都是使用消息传递的
【3】什么是管道
- 管道是一种半双工的通信机制,即只能在一个方向上进行数据传输。
- 子进程可以通过继承父进程的管道来实现通信。
- stdin、stdout和stderr是Python中的三个内置文件对象,它们分别代表标准输入、标准输出和标准错误。
- 子进程可以通过继承父进程的管道来实现通信。
- stdin、stdout和stderr是Python中的三个内置文件对象,它们分别代表标准输入、标准输出和标准错误。
- 这些对象也可以作为管道使用。
- 当我们在一个进程中使用read方法读取管道内的消息后,其他进程将无法再获取该管道内的任何其他消息。
- 因此,我们需要使用锁或其他同步机制来确保多个进程能够正确地访问和修改共享资源。
【4】什么是队列(管道+锁)
- 队列是一种线程安全的数据结构,它支持在多线程环境中高效地实现生产者-消费者模型。
- 队列的特性是先进先出(First-In-First-Out, FIFO),即先插入队列的数据将先被取出。
- 堆栈是一种后进先出(Last-In-First-Out, LIFO)的数据结构,与队列相反,最后插入的数据将被首先取出。
【5】进程间通信的目的
- 存是为了更好的取
- 千方百计的存
- 简单快捷的取
【二】队列介绍(推荐使用)
【1】创建队列的类(底层就是以管道和锁定的方式实现)
(1)语法
- Queue([maxsize]):
- 创建共享的进程队列
- Queue是多进程安全的队列
- 可以使用Queue实现多进程之间的数据传递
(2)参数介绍
- maxsize是队列中允许最大项数,省略则无大小限制。
【2】方法介绍
(1)主要方法
q.put
- 用以插入数据到队列中,put方法还有两个可选参数:blocked和timeout。
- 如果blocked为True(默认值),并且timeout为正值,该方法会阻塞timeout指定的时间,直到该队列有剩余的空间。如果超时,会抛出Queue.Full异常
- 如果blocked为False,但该Queue已满,会立即抛出Queue.Full异常。
q.get
- 可以从队列读取并且删除一个元素,同样,get方法有两个可选参数:blocked和timeout。
- 如果blocked为True(默认值),并且timeout为正值,那么在等待时间内没有取到任何元素,会抛出Queue.Empty异常。
- 如果blocked为False,有两种情况存在,如果Queue有一个值可用,则立即返回该值,否则,如果队列为空,则立即抛出Queue.Empty异常.
q.get_nowait()
- 同q.get(False)
q.put_nowait()
- 同q.put(False)
q.empty()
- 调用此方法时q为空则返回True,该结果不可靠,比如在返回True的过程中,如果队列中又加入了项目。
q.full()
- 调用此方法时q已满则返回True,该结果不可靠,比如在返回True的过程中,如果队列中的项目被取走。
q.qsize()
- 返回队列中目前项目的正确数量,结果也不可靠,理由同q.empty()和q.full()一样
(2)其他方法(了解)
q.cancel_join_thread()
- 不会在进程退出时自动连接后台线程。可以防止join_thread()方法阻塞
q.close()
- 关闭队列,防止队列中加入更多数据。
- 调用此方法,后台线程将继续写入那些已经入队列但尚未写入的数据,但将在此方法完成时马上关闭。
- 如果q被垃圾收集,将调用此方法。
- 关闭队列不会在队列使用者中产生任何类型的数据结束信号或异常。
- 例如,如果某个使用者正在被阻塞在get()操作上,关闭生产者中的队列不会导致get()方法返回错误。
q.join_thread()
- 连接队列的后台线程。
- 此方法用于在调用q.close()方法之后,等待所有队列项被消耗。
- 默认情况下,此方法由不是q的原始创建者的所有进程调用。调用q.cancel_join_thread方法可以禁止这种行为
【3】方法示例示例
- 小结
【三】进程间通信(IPC机制)
【1】什么是IPC机制
- IPC机制指进程间通信机制(Inter-Process Communication),它是指在不同进程间传输数据或者信息的一种机制。
- 在多进程操作系统中,各个进程相互独立,不能直接访问对方的内存空间,所以必须通过特殊的通信方式实现进程之间的信息交换和协调。
- 常见的IPC机制包括管道、消息队列、共享内存和信号量等方式。
- 其中,管道、消息队列和共享内存都是用于进程之间的数据传输
- 而信号量则是用于进程之间的同步与互斥。
- 通过使用IPC机制,可以使得不同进程能够有效地协同工作,在复杂的程序设计中起到十分重要的作用。
【2】子进程与主进程之间通过队列进行通信
【3】子进程与子进程之间通信
【四】生产者和消费者模型
【1】理论
(1)生产者模型
- 生产者模型和消费者模型是指通过利用队列解耦生产者和消费者的一种并发编程模型。
- 在生产者模型中,生产者负责将数据放入共享队列中,而消费者则从队列中取出数据进行处理。
- 生产者和消费者之间通过共享这个队列来进行信息的交流。
- 这种模型适用于生产者和消费者之间的处理速度不一致的情况,同时还能够保证数据传输的安全性和正确性。
(2)消费者模型
- 在消费者模型中,消费者负责向队列中插入任务,而由线程池中的工作线程进行任务的处理。
- 消费者和工作线程之间通过共享线程池中的任务队列来完成任务分发和执行。
- 这种模型适用于任务处理需要一定时间的情况,能够充分利用多线程的优势提高系统的并发性能,提高效率。
(3)小结
- 生产者:生产/制造东西
- 消费者:消费/处理东西
- 该模型还需要一个媒介
【2】场景
(1)消费者大于生产者
- 消费者没有数据被卡主
(2)解决消费者大于生产者的情况
生产者和消费者模型小结
【五】多线程
【1】什么是线程
- 在传统操作系统中,每个进程有一个地址空间,而且默认就有一个控制线程
- 线程顾名思义,就是一条流水线工作的过程
- 一条流水线必须属于一个车间,一个车间的工作过程是一个进程
- 车间负责把资源整合到一起,是一个资源单位,而一个车间内至少有一个流水线
- 流水线的工作需要电源,电源就相当于cpu
- 所以进程只是用来把资源集中到一起(进程只是一个资源单位,或者说资源集合),而线程才是cpu上的执行单位。
- 多线程(即多个控制线程)的概念是在一个进程中存在多个控制线程,多个控制线程共享该进程的地址空间,相当于一个车间内有多条流水线,都共用一个车间的资源。
- 例如
- 北京地铁与上海地铁是不同的进程,而北京地铁里的13号线是一个线程,北京地铁所有的线路共享北京地铁所有的资源,比如所有的乘客可以被所有线路拉。
【六】线程和进程的区别
- Threads share the address space of the process that created it; processes have their own address space.
- 线程共享创建它的进程的地址空间; 进程具有自己的地址空间。
- Threads have direct access to the data segment of its process; processes have their own copy of the data segment of the parent process.
- 线程可以直接访问其进程的数据段; 进程具有其父进程数据段的副本。
- Threads can directly communicate with other threads of its process; processes must use interprocess communication to communicate with sibling processes.
- 线程可以直接与其进程中的其他线程通信; 进程必须使用进程间通信与同级进程进行通信。
- New threads are easily created; new processes require duplication of the parent process.
- 新线程很容易创建; 新进程需要复制父进程。
- Threads can exercise considerable control over threads of the same process; processes can only exercise control over child processes.
- 线程可以对同一进程的线程行使相当大的控制权。 进程只能控制子进程。
- Changes to the main thread (cancellation, priority change, etc.) may affect the behavior of the other threads of the process; changes to the parent process does not affect child processes.
- 对主线程的更改(取消,优先级更改等)可能会影响该进程其他线程的行为; 对父进程的更改不会影响子进程。
【七】threading模块介绍
- multiprocess模块的完全模仿了threading模块的接口
- 二者在使用层面,有很大的相似性,因而不再详细介绍
官网链接:https://docs.python.org/3/library/threading.html?highlight=threading
【八】什么是多线程
- 开启线程不需要在main下面执行代码,直接书写即可
- 但是我们还是习惯性的将启动命令写在main下面
【1】多线程的创建方式
【2】多进程和多线程比较
__EOF__

本文作者:Fredette
本文链接:https://www.cnblogs.com/Fredette/p/17982375.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
本文链接:https://www.cnblogs.com/Fredette/p/17982375.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~