You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python3多进程中defaultdict同步异常问题及原因咨询

问题原因分析与解决办法

嘿,这个问题我之前处理多进程数据同步时也踩过坑,咱们来好好拆解下为什么会出现这种差异:

核心原因:DictProxy的同步机制

你通过MyManager创建的multi_d其实是DictProxy类型的代理对象,它的工作逻辑是只同步对字典顶层键的直接操作,而嵌套对象(比如你这里的list)的内部修改,它是追踪不到的。

咱们对比下两种操作的差异:

  1. multi_dict[k] += 1能正常工作:
    这个操作等价于三步:

    temp = multi_dict[k]  # 从主进程读取值
    temp += 1             # 子进程里修改值
    multi_dict[k] = temp  # 将修改后的值写回主进程的字典
    

    最后一步multi_dict[k] = temp是对字典顶层键的赋值操作,DictProxy会把这个写操作转发回主进程的真实字典,所以更新能生效。

  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 09:46:02