Python3多进程中defaultdict同步异常问题及原因咨询
问题原因分析与解决办法
嘿,这个问题我之前处理多进程数据同步时也踩过坑,咱们来好好拆解下为什么会出现这种差异:
核心原因:DictProxy的同步机制
你通过MyManager创建的multi_d其实是DictProxy类型的代理对象,它的工作逻辑是只同步对字典顶层键的直接操作,而嵌套对象(比如你这里的list)的内部修改,它是追踪不到的。
咱们对比下两种操作的差异:
multi_dict[k] += 1能正常工作:
这个操作等价于三步:temp = multi_dict[k] # 从主进程读取值 temp += 1 # 子进程里修改值 multi_dict[k] = temp # 将修改后的值写回主进程的字典最后一步
multi_dict[k] = temp是对字典顶层键的赋值操作,DictProxy会把这个写操作转发回主进程的真实字典,所以更新能生效。multi_dict[k].append(idx)失败:
这个操作是先通过multi_dict[k]拿到列表的引用(子进程本地的临时引用),然后直接在这个引用上调用append。但整个过程没有触发对字典顶层键的写操作,DictProxy根本不知道你修改了嵌套的列表,所以主进程里的字典对应的列表始终是空的。
解决办法:显式触发同步
要让列表的修改同步回主进程,你需要显式地把修改后的列表重新赋值给字典的顶层键,让DictProxy捕捉到这个写操作。修改你的partial_test函数即可:
def partial_test(string, multi_dict, idx): k = string[idx] # 1. 取出当前列表 current_list = multi_dict[k] # 2. 修改列表 current_list.append(idx) # 3. 重新赋值,触发代理同步 multi_dict[k] = current_list
这样修改后,再运行你的代码,就能得到预期的结果:
[('m', [0]), ('i', [1, 4, 7, 10]), ('s', [2, 3, 5, 6]), ('p', [8, 9])]
内容的提问来源于stack exchange,提问作者galactica
相关产品推荐
相关产品推荐

