defaultdict在python3的多处理中未同步

时间:2018-05-14 21:05:27

标签: python multiprocessing

我有一段时间没遇到这个问题,但还没有弄明白,即如何在儿童进程中同步字典。 这在尝试独立处理一堆文件时非常有用,同时跟踪有关文件/数据集的一些统计信息。

使用来自Using defaultdict with multiprocessing?的有用提示,我想出了类似的内容:

class MyManager(BaseManager):
    pass

MyManager.register('defaultdict', defaultdict, DictProxy)

def partial_test(string, multi_dict, idx):
    k = string[idx]
    multi_dict[k].append(idx)     // record indices, failed!
    // multi_dict[k] += 1         // this works as expected!

def job():
    mgr = MyManager()
    mgr.start()
    multi_d = mgr.defaultdict(list)

    pool = multiprocessing.Pool(processes=4)
    partial_job = partial(partial_test, 'mississippi', multi_d)
    N = len('mississippi')
    pool.map(partial_job, range(N))

    pool.close()
    pool.join()
    print(multi_d.items())

输出结果为:

[('m', []), ('i', []), ('s', []), ('p', [])]

对于我的应用程序,我不得不对pool.map()使用partial(),但字典没有正确更新。 另外,正如我上面提到的,如果multi_dict被用作计数器,就像在链接的示例中那样,一切都按预期工作(当然,定义更改为defaultdict(int))。 谁知道为什么?

0 个答案:

没有答案