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

Python multiprocessing Manager返回空字典问题咨询

问题分析与解决:multiprocessing Manager字典赋值后为空的问题

先看你提供的代码:

import multiprocessing

def test(d):
    a = {}
    for i in range(10):
        a[i] = i +1
    print(a)
    d = a

if __name__ == "__main__":
    manager = multiprocessing.Manager()
    d = manager.dict()

    p = multiprocessing.Process(target = test, args = (d, ))
    p.start()
    p.join()
    print(d)

问题原因

你犯了一个典型的多进程变量引用错误:

  • 子进程函数test里的d是局部参数,一开始它指向主进程传过来的共享Manager字典对象。
  • 当你执行d = a时,只是把这个局部变量d的引用换成了普通字典a,完全没有修改原来的共享Manager字典的内容。
  • 多进程之间内存是相互隔离的,只有通过Manager共享对象自身的方法(比如update、键值赋值)修改,才能把变更同步回主进程。

解决方法

不要直接给局部变量d重新赋值,而是修改它指向的共享字典的内容,比如用update方法把a的内容同步进去:

修改后的代码:

import multiprocessing

def test(d):
    a = {}
    for i in range(10):
        a[i] = i + 1
    print(a)
    # 用update将a的内容更新到共享字典中
    d.update(a)

if __name__ == "__main__":
    manager = multiprocessing.Manager()
    d = manager.dict()

    p = multiprocessing.Process(target=test, args=(d,))
    p.start()
    p.join()
    print(d)

运行这段代码,主进程打印的d就会是{0: 1, 1: 2, ..., 9: 10},和子进程里的a内容一致。

你也可以选择逐个给共享字典赋值键值对:

for k, v in a.items():
    d[k] = v

两种方法都能实现你想要的效果,update更简洁高效。

内容的提问来源于stack exchange,提问作者Phil

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 21:40:31