使用multiprocessing.Pool时出现问题

时间:2017-09-15 21:20:24

标签: python python-2.7 multiprocessing

我有以下代码。 generate(self, num)是一种类方法,它生成一组数字并将它们转换为二进制表示形式:

def generate(self, num):
    M = [random.randint(0, 2 ** 64 - 1) for _ in range(num)]
    M = list(set(M))
    M = [('{0:0' + str(64) + 'b}').format(x) for x in M]
    M = np.asarray([list(map(int, list(x))) for x in M])
    return M

def run(self):
    M = []
    num = 10000
    mlp = multiprocessing.Pool(multiprocessing.cpu_count()-1)
    for i in xrange(0, num):
        res = mlp.apply_async(self.generate, args=(i,))
        M.append(res) # Here I think it is not good!!
    mlp.close()
    mlp.join()

附加到M的结果不正确,我得到<multiprocessing.pool.ApplyResult object at 0x11ae6f690>。如何修复此代码以实现并行性是一种有效的方法?

2 个答案:

答案 0 :(得分:1)

您不能使用list在多个进程之间共享/交换数据,它不是线程安全的。您应该使用Manager对象进行进程之间的数据操作。 Manager()返回的管理器将支持类型列表,dict,Namespace,Lock,RLock,Semaphore,BoundedSemaphore,Condition,Event,Queue,Value和Array。

答案 1 :(得分:0)

Medoo和Haifeng的好评。查看您从apply_async方法返回的multiprocessing.pool.ApplyResult对象的文档。您只是缺少对该对象的方法调用。

该对象有以下方法可以调用,我认为你原来的问题都缺少了。打开底部的链接以查看其他变体。

获取([超时]) 到达时返回结果。如果timeout不是None并且结果未在超时秒内到达,则引发multiprocessing.TimeoutError。如果远程调用引发异常,那么get()将重新引发该异常。此方法将一直阻塞,直到返回结果或直到达到超时。

https://docs.python.org/2/library/multiprocessing.html#multiprocessing.pool.AsyncResult