Python多进程通信实战:Queue与Pipe详解
本文深入解析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作图示例
如有不足之处,欢迎留言指出。
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









