2017-09-15 19 views
0

我有以下代码。 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>。我怎样才能解决这个代码来实现并行性是一种有效的方法?

+0

'解析度= mlp.apply_async(self.generate,ARGS =(我))''不过是i'递增,所以你觉得用什么'M = [random.randint发生(0 ,2 ** 64 - 1)for _ in range(num)]'? – roganjosh

回答

1

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

+0

我敢肯定,这段代码在'for'循环里面有'apply_async',所以这可能是他们最担心的问题 – roganjosh

0

来自梅道和海峰的好消息。查看您从apply_async方法获得的multiprocessing.pool.ApplyResult对象的文档。您只是缺少对该对象的方法调用。

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

GET([超时]) 回当它到达的结果。如果超时不是“无”,并且结果未在超时秒内到达,则会引发multiprocessing.TimeoutError。如果远程调用引发了异常,那么get()将重新引发该异常。此方法将阻塞,直到返回结果或达到超时。

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