如何通过多处理访问共享字典?

时间:2012-02-13 05:55:14

标签: python

我认为我正确地遵循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中执行此操作,请告诉我。

1 个答案:

答案 0 :(得分:3)

test的定义更改为:

def test(x, d):
    for xx in range(100):
        for xxx in range(100):
            d[x]=xx*xxx

否则你只是增加一些全局dictionary(没有同步),以后再也不会访问它。


至于一般方法,我认为这个方法在共享字典上有很多争用。您是否真的必须尽快从每个进程更新它?在每个进程中累积批量的部分结果并且偶尔更新共享对象应该会更好。