首页 > 解决方案 > python3的多处理中的defaultdict不同步

问题描述

我有这个问题有一段时间了,还没有弄清楚,即如何在子进程之间同步字典。当尝试独立处理一堆文件同时跟踪有关文件/数据集的一些统计信息时,这通常很有用。

有用的提示来自:使用 defaultdict 和多处理?,我想出了类似的东西:

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', [])]

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

标签: pythonmultiprocessing

解决方案


推荐阅读