为何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的子进程和主进程拥有完全独立的内存空间:
- 当
pool.map传递字典给子进程时,会对原字典做一次完整拷贝,子进程操作的只是这个拷贝版; - 原函数没有返回修改后的字典,
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
相关产品推荐
相关产品推荐

