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

如何使用Python Pool进程池更新全局字典 解决运行后为空的问题

问题原因
  • Python多进程模式下,每个子进程拥有独立的内存地址空间,你传入的普通Python字典属于不可跨进程共享的对象,子进程修改的只是自身内存中的字典副本,改动不会同步回主进程,因此主进程的globalDict始终为空。
修复方案1:使用multiprocessing.Manager创建共享字典

该方案代码改动最小,共享对象自带进程安全保障,适合数据量不大的场景:

from multiprocessing import Pool, Manager
import time

def f(x):
    global globalDict 
    globalDict.setdefault(str(x),x)
    return globalDict

def init_pool(dictX):
    global globalDict
    globalDict = dictX

if __name__ == '__main__':
    start=time.time()
    # 替换为Manager创建的可跨进程同步的字典
    globalDict = Manager().dict()
    pool=Pool(initializer=init_pool, initargs=(globalDict,)) 
    pool.map(f, range(3)) 
    pool.close()
    pool.join()
    stop=time.time()
    # 转普通字典方便查看结果
    print('最终结果:', dict(globalDict))
    print('Done in {:4f}'.format(stop-start))
修复方案2:收集子进程返回结果合并

该方案无跨进程共享开销,性能更高,适合数据量大的场景:

from multiprocessing import Pool
import time

def f(x):
    # 子进程仅返回自身处理的键值对,无需操作全局变量
    return (str(x), x)

if __name__ == '__main__':
    start=time.time()
    globalDict = {}
    pool=Pool()
    # 收集所有子进程返回结果,在主进程合并
    result = pool.map(f, range(3)) 
    for k, v in result:
        globalDict[k] = v
    pool.close()
    pool.join()
    stop=time.time()
    print('最终结果:', globalDict)
    print('Done in {:4f}'.format(stop-start))

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 03:48:01