python - 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)
当然,定义更改为)。有人知道为什么吗?
解决方案
推荐阅读
- forms - 如何使用反应形式设置不同的输入类型?
- sql - 通过 PowerShell 将数据插入 SQL 时缺少行
- android - 如何在kotlin中创建对象数组并按索引插入值
- asp.net-core - 我在尝试使用 JWT-ASP.NETCORE 3.1 时遇到 ıdx10653 错误
- c# - 创建和合并 GitHub 拉取请求 API C#
- java - 在没有 setter/getter 的情况下切换其他类中的变量
- docker - 将 gitlab ssh 公钥添加到公司防火墙后面的 dockerfile 中的已知主机(无端口 22)
- wordpress-theming - 已删除儿童主题内容
- reactjs - 如何将自定义道具传递给 SwiperSlide 并获取它的 onSlideChange 函数?
- apache-spark - 在火花中加载未知分区大小时防止OOO