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
相关产品推荐
相关产品推荐

