Python多进程编程与进程间通信方式
请介绍Python multiprocessing模块的常见用法,并对比Queue、Pipe、Value/Array、Manager四种进程间通信(IPC)方式。
回答
Yahuda
multiprocessing基础:
from multiprocessing import Process, Pool
def worker(n):
return n * n
# 方式1:Process
p = Process(target=worker, args=(10,))
p.start()
p.join()
# 方式2:Pool进程池
with Pool(4) as pool:
results = pool.map(worker, range(100))
IPC对比: | 方式 | 类型 | 数据 | 速度 | 适用场景 | |------|------|------|------|---------| | Queue | 队列 | 任意可pickle对象 | 中等 | 生产者-消费者模式,多对多 | | Pipe | 双向管道 | 任意可pickle对象 | 最快 | 一对一双向通信 | | Value/Array | 共享内存 | 仅ctype类型 | 次快 | 简单共享整数/浮点/数组 | | Manager | 代理对象 | 任意pickle对象 | 慢 | 共享复杂数据结构(list/dict) |
示例:
from multiprocessing import Process, Queue
def producer(q):
for i in range(5):
q.put(i)
def consumer(q):
while True:
item = q.get()
if item is None:
break
print(f'Got: {item}')
q = Queue()
p1 = Process(target=producer, args=(q,))
p2 = Process(target=consumer, args=(q,))
p1.start(); p2.start()
p1.join()
q.put(None) # 结束信号
p2.join()
注意:多进程共享资源需使用Lock/RLock同步。multiprocessing有Manager类型自动处理锁。