我认为我正确地遵循python文档但是我无法获得我正在寻找的结果。我基本上有一个数字列表,它们被传递给嵌套for循环函数,输出保存在字典中。
以下是代码:
from multiprocessing import Pool, Manager
list = [1,2,3,10]
dictionary = {}
def test(x, dictionary):
for xx in range(100):
for xxx in range(100):
dictionary[x]=xx*xxx
if __name__ == '__main__':
pool = Pool(processes=4)
mgr = Manager()
d = mgr.dict()
for N in list:
pool.apply_async(test, (N, d))
# Mark pool as closed -- no more tasks can be added.
pool.close()
# Wait for tasks to exit
pool.join()
# Output results
print d
这是预期的结果:
{1: 9801, 2: 9801, 3: 9801, 10: 9801}
对我做错了什么的建议?另外,我还没有说服自己共享资源是最好的方法(考虑使用数据库维护状态)所以如果我的方法完全有缺陷或者有更好的方法在python中执行此操作,请告诉我。
答案 0 :(得分:3)
将test
的定义更改为:
def test(x, d):
for xx in range(100):
for xxx in range(100):
d[x]=xx*xxx
否则你只是增加一些全局dictionary
(没有同步),以后再也不会访问它。
至于一般方法,我认为这个方法在共享字典上有很多争用。您是否真的必须尽快从每个进程更新它?在每个进程中累积批量的部分结果并且偶尔更新共享对象应该会更好。