为什么get()在多处理中速度慢?

时间:2014-11-18 18:17:30

标签: python multiprocessing

我有一个基本的多处理类,它接受一些参数并将它们发送给一个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秒。不知道为什么......

1 个答案:

答案 0 :(得分:4)

您看到性能不佳,因为您在进程之间发送了一个大对象。在子进程中对对象进行pickle,在进程之间发送这些字节,然后在父进程中对其进行unpickling,需要花费大量的时间。这是multiprocessing建议avoiding large amounts of shared state的最佳做法的原因之一:

  

避免共享状态

     

应尽量避免大量移动   流程之间的数据。

如果您在对象上调用pickle.loads(pickle.dumps(obj)),则可能会隔离此行为。我希望它几乎与get()电话一样长。