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

为何Python多进程更新列表字典无效?如何实现多进程更新?

多进程下字典无法更新的原因及解决办法

单进程中字典能成功更新的原因

先看单进程代码:

def update_dictionary(mydict):
    mydict['sampleKey'] = 1

d = [{'test':2}, {'tast':3}]
for i in d:
    update_dictionary(i)

Python中字典是可变对象,当把列表里的字典传给update_dictionary函数时,传递的是字典的内存引用。函数里对字典的修改直接作用于原对象的内存空间,所以原列表中的字典会被同步更新。

多进程Pool中字典无法更新的原因

再看多进程代码:

from multiprocessing import Pool

def update_dictionary(mydict):
    mydict['sampleKey'] = 1

d = [{'test':2}, {'tast':3}]
with Pool(processes=4) as pool:
    for q in pool.map(update_dictionary, d):
        print('done')

multiprocessing.Pool的子进程和主进程拥有完全独立的内存空间:

  1. 当pool.map传递字典给子进程时,会对原字典做一次完整拷贝,子进程操作的只是这个拷贝版;
  2. 原函数没有返回修改后的字典,pool.map最终得到的是一组None,主进程的原字典根本没被修改。

多进程实现字典更新的可行方案

方案1:返回修改后的字典,主进程重组列表

修改函数让它返回更新后的字典,用pool.map的结果替换原列表:

from multiprocessing import Pool

def update_dictionary(mydict):
    mydict['sampleKey'] = 1
    return mydict

d = [{'test':2}, {'tast':3}]
with Pool(processes=4) as pool:
    d = pool.map(update_dictionary, d)

print(d)

输出结果:

[{'test': 2, 'sampleKey': 1}, {'tast': 3, 'sampleKey': 1}]

这种方式简单直接,适合字典体积不大的场景,避免了复杂的共享内存操作。

方案2:使用Manager创建共享字典

如果字典体积较大,不想频繁拷贝,可以用multiprocessing.Manager创建跨进程共享的字典对象:

from multiprocessing import Pool, Manager

def update_dictionary(shared_dict):
    shared_dict['sampleKey'] = 1

if __name__ == '__main__':
    manager = Manager()
    # 创建可跨进程访问的共享字典列表
    d = [manager.dict({'test':2}), manager.dict({'tast':3})]
    
    with Pool(processes=4) as pool:
        pool.map(update_dictionary, d)
    
    # 转换为普通字典查看最终结果
    d = [dict(item) for item in d]
    print(d)

输出结果和方案1一致。注意:共享对象会引入一定的性能开销,只在确实需要共享状态的场景下使用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 20:57:42