Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用multiprocessing.Pool时出现问题_Python_Python 2.7_Multiprocessing - Fatal编程技术网

Python 使用multiprocessing.Pool时出现问题

Python 使用multiprocessing.Pool时出现问题,python,python-2.7,multiprocessing,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

我有以下代码
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
中的结果不正确,我得到
。如何修复此代码以实现并行性是一种有效的方法?

您不能使用
list
在多个进程之间共享/交换数据,这不是线程安全的。您应该使用
Manager
对象在进程之间进行数据操作。manager()返回的管理器将支持类型列表、dict、命名空间、锁、RLock、信号量、绑定信号量、条件、事件、队列、值和数组。

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

这个对象有下面的方法可以调用,我想这就是你最初的问题所缺少的。打开底部的链接以查看其他变体

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


res=mlp.apply_async(self.generate,args=(i,)
但是
i
是递增的,那么您认为
M=[random.randint(0,2**64-1)在范围内(num)会发生什么
?我很确定这段代码在
for
循环中有
apply\u async
,所以这可能是他们最不担心的