最佳答案
假设我有一个内存中的大数组,我有一个函数 func
,它接受这个大数组作为输入(连同一些其他参数)。具有不同参数的 func
可以并行运行。例如:
def func(arr, param):
# do stuff to arr, param
# build array arr
pool = Pool(processes = 6)
results = [pool.apply_async(func, [arr, param]) for param in all_params]
output = [res.get() for res in results]
如果我使用多处理库,那么这个巨大的数组将被多次复制到不同的进程中。
有没有办法让不同的进程共享同一个数组?此数组对象是只读的,永远不会被修改。
更复杂的是,如果 arr 不是一个数组,而是一个任意的 python 对象,有没有共享它的方法?
[编辑]
我读了答案,但我还是有点困惑。由于 fork ()是在写时复制的,所以在 Python 多处理库中产生新进程时,不应该调用任何额外的成本。但是下面的代码表明存在巨大的开销:
from multiprocessing import Pool, Manager
import numpy as np;
import time
def f(arr):
return len(arr)
t = time.time()
arr = np.arange(10000000)
print "construct array = ", time.time() - t;
pool = Pool(processes = 6)
t = time.time()
res = pool.apply_async(f, [arr,])
res.get()
print "multiprocessing overhead = ", time.time() - t;
输出(顺便说一句,成本随着数组大小的增加而增加,因此我怀疑仍然存在与内存复制相关的开销) :
construct array = 0.0178790092468
multiprocessing overhead = 0.252444982529
如果我们不复制数组,为什么会有这么大的开销?共享记忆救了我什么?