2017-08-29 65 views
2

这是一个非常简单的我正在使用的更复杂的代码版本。问题是我想将方法​​()函数中计算的项追加到稍后可以显示的某个列表中。但是,运行此代码时,列表对象为空,而结果数组已满。如何在并行进程(python)中追加项目到列表?

import multiprocessing as mp 
    global list 
    list = [] 
    def add(thing): 
     list.append(thing) 
    def method(): 
     global list 
     add(8) #doesn't work as wanted 
     return 7 
    def logResult(result): 
     results.append(result) 

    if (__name__ == '__main__'): 
     results = [] 
     cpu = mp.cpu_count() 
     pool = mp.Pool(processes=cpu) 
     for x in range(0, 2000): 
      pool.apply_async(method,callback=logResult) 
     pool.close() 
     pool.join() 
     print list 
     print results 

输出:

[] 
    [7,7,7,7,7,7,7,7,7....] and so on. 

我知道add方法似乎是多余的,但一个简单的list.append()方法()函数中也不起作用。 add方法是为了镜像logResult方法()。我可以看到它为什么不起作用,但我不知道如何解决这个问题。如果没有并行化,程序会按照需要运行,但是我的项目需要并行化,因为完成的计算比method()函数要冗长得多。期望的输出将是

[8,8,8,8,8,8,8,8,8,8,8,8,...] 
    [7,7,7,7,7,7,7,7,7,7,7,7,...] and so on. 

在此先感谢。

+1

全局变量不能在python进程间共享。最简单的解决方案是从'method'返回7和8,然后将8收集到列表中。请参阅'Pool.map'。 –

回答

0

看来你已经在method()中设置了global list这是空的。如果你之前已经设置过,它不需要在方法()中。

0
pool.apply_async(method,callback=logResult) 
  1. 你的方法和功能缺失()。
  2. logResult应该有话要传递(根据您的代码)

简单地改变这样的:

pool.apply_async(method(),callback=logResult(7)) 

GET结果[8,8,8,8,8 ...] ,[7,7,7,7,7 ...]

相关问题