在流程之间分享词典

时间:2014-01-16 17:46:51

标签: python dictionary multiprocessing

我想要一个dict与4个进程共享,这些进程可以实时修改dict中的值。 dict是使用Manager().dict()创建的 问题是,每次进程修改dict时,是否需要锁定资源?如果4个进程实时访问此dict该怎么办?

1 个答案:

答案 0 :(得分:3)

然后你会看到未定义的行为。这是一个简单的测试程序:

def worker(t):
    d, i = t
    d[i % 10] += 1

if __name__ == "__main__":
    import multiprocessing as mp
    pool = mp.Pool()
    d = mp.Manager().dict()
    for i in range(10):
        d[i] = 0
    pool.map(worker, ((d, i) for i in xrange(1000)))
    pool.close()
    pool.join()
    print d, sum(d.values())

以下是3次运行的示例输出:

{0: 97, 1: 96, 2: 98, 3: 96, 4: 96, 5: 99, 6: 97, 7: 96, 8: 96, 9: 94} 965
{0: 97, 1: 97, 2: 96, 3: 97, 4: 97, 5: 97, 6: 95, 7: 95, 8: 93, 9: 96} 960
{0: 98, 1: 97, 2: 98, 3: 96, 4: 97, 5: 95, 6: 97, 7: 97, 8: 97, 9: 98} 970

要在每个存储桶中获得“预期”计数100,您还需要创建一个mp.Manager().Lock()对象,传递它,并在worker()中使用它来保护字典变异。