【发布时间】:2018-02-07 05:49:57
【问题描述】:
这是我正在使用的更复杂代码的一个非常简单的版本。问题是我想将在 method() 函数中计算的项目附加到稍后可以显示的列表中。然而,当这段代码运行时,列表对象是空的,而结果数组是满的。
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 方法似乎是多余的,但是在 method() 函数中的简单 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.
提前致谢。
【问题讨论】:
-
全局变量不能跨 python 进程共享。最简单的解决方案是从
method返回 7 和 8,然后将 8 收集到一个列表中。见Pool.map。
标签: python list parallel-processing append