如何使用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
相关产品推荐
相关产品推荐

