我有一个基本的多处理类,它接受一些参数并将它们发送给一个worker:
class Multi(object):
def __init__(self, pool_parameters, pool_size):
self.pool_parameters = pool_parameters # Parameters in a tuple
self.pool_size = pool_size
self.pool = mp.Pool(self.pool_size)
self.results = \
[self.pool.apply_async(worker, args=((self.pool_parameters[i]),),)
for i in range(self.pool_size)]
time1 = time.time()
self.output = [r.get() for r in self.results] # Output objects in here
print time.time() - time1
def worker(*args):
# Do stuff
return stuff
然而r.get()行似乎需要很长时间。如果我的pool_size为1,则worker在0.1秒内返回其结果,但r.get()行需要另外1.35秒。为什么需要这么长时间,特别是如果只启动一个进程?
编辑:对于单个进程并使用worker返回单个None值,self.output行在我的系统上仍需要1.3秒(使用time.time()来计算该行的时间)
EDIT2:抱歉,我发现了问题,我不认为这与多处理有关。问题似乎来自导入各种其他模块。当我摆脱我的进口时间是0.1秒。不知道为什么......
答案 0 :(得分:4)
您看到性能不佳,因为您在进程之间发送了一个大对象。在子进程中对对象进行pickle,在进程之间发送这些字节,然后在父进程中对其进行unpickling,需要花费大量的时间。这是multiprocessing
建议avoiding large amounts of shared state的最佳做法的原因之一:
避免共享状态
应尽量避免大量移动 流程之间的数据。
如果您在对象上调用pickle.loads(pickle.dumps(obj))
,则可能会隔离此行为。我希望它几乎与get()
电话一样长。