我想要一个dict
与4个进程共享,这些进程可以实时修改dict
中的值。 dict是使用Manager().dict()
创建的
问题是,每次进程修改dict
时,是否需要锁定资源?如果4个进程实时访问此dict
该怎么办?
答案 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()
中使用它来保护字典变异。