我有一段时间没遇到这个问题,但还没有弄明白,即如何在儿童进程中同步字典。 这在尝试独立处理一堆文件时非常有用,同时跟踪有关文件/数据集的一些统计信息。
使用来自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)
)。
谁知道为什么?