Multiprocessing 通信
由于全局解释器的存在,Python 进行 CPU 密集任务时必须使用多进程而非多线程。科学计算中面临如何在多进程间共享数据的问题。
从官方文档调研到以下主要的通信方式:
Multiprocessing.Queue
. 多进程安全的通信队列,一个进程像队列中写入,另一个进程读出。支持检测队列是否空、是否满等操作。Multiprocessing.Value, Array
. 用于多进程间共享变量(共享内存)。支持 Python 基本变量,非基本变量如 Numpy 数组需要先转换为 Bytearray 再进行共享(Numpy 实现有方便的与 Bytearray 互转的基础设施)。Multiprocessing.Manager
:
from multiprocessing import Process, Manager
def f(d, l):
d[1] = '1'
d['2'] = 2
d[0.25] = None
l.reverse()
if __name__ == '__main__':
with Manager() as manager:
d = manager.dict()
l = manager.list(range(10))
p = Process(target=f, args=(d, l))
p.start()
p.join()
print(d)
print(l)
类似于共享内存,Manager 能够实现一般的共享变量,且甚至可以跨物理主机共享变量。其问题是底层实现不是共享内存,效率较低。
其他多进程通信设备:
Multiprocessing.Pipe
. 传统的管道。有点像长度为 1 的队列。Multiprocessing.Lock
. 多进程锁。
Multiprocessing Pool
p = multiprocessing.Pool(4)
p.map(print, [1,2,3,4])