Python多进程通信实战:Queue与Pipe详解

小岛来信
小岛来信
发布时间:2026-10-13| 2人浏览过
原创

本文深入解析Python中利用multiprocessing库实现多进程间通信的方法。通过Queue和Pipe两个核心组件,详细演示了如何创建子进程、传递数据以及处理同步问题。文章涵盖Queue的put/get操作及阻塞机制,Pipe的双工与单工模式,并附带完整代码示例与输出结果,帮助开发者高效利用多核资源。

Python内置的多线程机制受限于全局解释器锁(GIL),并非真正的并行多线程。若要充分利用多核CPU的计算能力,在Python中通常需采用多进程方案。Python提供了功能完善的multiprocessing包,开发者只需定义目标函数,库会自动处理其余底层逻辑。借助该包,可轻松实现从单进程到并发执行的平滑过渡。该模块支持子进程创建、进程间通信与共享数据、以及多种形式的同步机制,提供了Process、Queue、Pipe、Lock等关键组件。

multiprocessing.Queue()

以Queue为例,演示在父进程中创建两个子进程:一个负责向Queue写入数据,另一个负责从Queue读取数据。

multiprocessing.Queue.put() 用于入队操作

multiprocessing.Queue.get() 用于出队操作

队列、线程与进程的安全性分析

put(obj[, block[, timeout]])

将对象obj放入队列。若可选参数block为True(默认值)且timeout为None(默认值),当队列满时将阻塞等待,直到有空闲槽位。若timeout为正数,则最多阻塞timeout秒,若超时后仍无空闲槽位,则抛出Queue.Full异常。若block为False,则仅在槽位立即可用时放入项目,否则直接抛出Queue.Full异常(此时忽略timeout参数)。

get([block[, timeout]])

从队列中移除并返回一个项目。若可选参数block为True(默认值)且timeout为None(默认值),当队列为空时将阻塞等待,直到有项目可用。若timeout为正数,则最多阻塞timeout秒,若超时后仍无可用项目,则抛出Queue.Empty异常。若block为False,则仅在项目立即可用时返回该项目,否则直接抛出Queue.Empty异常(此时忽略timeout参数)。

#- * -coding: utf - 8 - * -
  from multiprocessing
import Process, Queue
import os
import time
import random


# 写数据进程执行的代码:
  def write(q):
  print('Process to write: %s' % os.getpid())
for value in ['A', 'B', 'C']:
  print('Put %s to queue...' % value)
q.put(value)
time.sleep(random.random())

# 读数据进程执行的代码:
  def read(q):
  print('Process to read: %s' % os.getpid())
while True:
  value = q.get()
print('Get %s from queue.' % value)

if __name__ == '__main__': #父进程创建Queue, 并传给各个子进程:
q = Queue()
pw = Process(target = write, args = (q, ))
pr = Process(target = read, args = (q, ))# 启动子进程pw, 写入:
  pw.start()# 启动子进程pr, 读取:
  pr.start()# 等待pw结束:
  pw.join()# pr进程里是死循环, 无法等待其结束, 只能强行终止:
  pr.terminate()

运行输出结果

Process to read: 5836
Process to write: 6472
Put A to queue...
Put B to queue...
Get A from queue.
Put C to queue...
Get B from queue.
Get C from queue.

Process finished with exit code 0

multiprocessing.Pipe()

Pipe()函数返回一对由管道连接的Connection对象,默认情况下为双工(双向)模式。

Pipe()返回的两个Connection对象代表管道的两端。每个连接对象均具备send()和recv()方法。需注意,若两个进程(或线程)同时尝试读取或写入管道的同一端,可能导致数据损坏。然而,若进程分别使用管道的不同端进行通信,则不存在此类风险。

该函数返回表示管道两端的一对Connection对象(conn1,conn2)。

若duplex参数为True(默认值),则管道支持双向通信。

若duplex参数为False,则管道为单向模式:conn1仅用于接收消息,conn2仅用于发送消息。

#- * -coding: utf - 8 - * -
  from multiprocessing
import Process, Pipe

def f(conn):
  conn.send([42, None, 'hello'])
while True:
  print(conn.recv())

if __name__ == '__main__':
  parent_conn, child_conn = Pipe()
p = Process(target = f, args = (child_conn, ))
p.start()
print parent_conn.recv()# prints "[42, None, 'hello']"
parent_conn.send('666')
p.terminate()

运行输出结果

[42, None, 'hello']
666

Process finished with exit code 0

总结

以上为Python多进程实现进程间通信实例的完整内容,希望对你有所帮助。感兴趣的朋友可继续参阅本站相关文章:

Python编程实现蚁群算法详解

python绘制铅球的运行轨迹代码分享

Python中turtle作图示例

如有不足之处,欢迎留言指出。

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。