【发布时间】:2015-01-16 01:07:11
【问题描述】:
我有一个基本的多处理类,它接受一些参数并将它们发送给工作人员:
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,则工作人员会在 0.1 秒内返回其结果,但 r.get() 行又需要 1.35 秒。为什么需要这么长时间,尤其是如果只启动一个进程?
编辑:对于单个进程并使用 worker 返回单个 None 值,self.output 行在我的系统上仍然需要 1.3 秒(使用 time.time() 来计时该行)
EDIT2:抱歉,我发现了问题,我认为这与多处理无关。问题似乎来自导入各种其他模块。当我摆脱进口时,时间是 0.1 秒。不知道为什么...
【问题讨论】:
-
您从
worker返回的对象有多大?另外,您如何测量运行get调用需要多长时间? -
它包装了一个图像文件和一个 csv 文件,所以它目前大约 8 mb。但最终它应该是 250 mb。我在 self.output 行的任一侧使用 time.time() 。在类外调用worker()是0.1秒