如何在Python pathos.multiprocess多进程中正确共享字典?
Python pathos多进程中共享字典的问题与解决方法
问题概述
能否在Python的pathos.multiprocessing多进程环境中共享字典变量?尝试两段代码均未成功:
- 使用普通字典,执行后主进程的
skus仍为空,未得到预期的{0:0,1:1,…}结果; - 改用
multiprocessing.Manager().dict(),触发multiprocessing.context.AuthenticationError认证错误。
第一段测试代码
from pathos.multiprocessing import Pool as ProcessPool def outer(): skus = {} def process(skus, sku): skus[sku] = sku * 10 with ProcessPool() as pool: pool.starmap(process, ((skus, sku) for sku in range(100)), chunksize=3) print(skus) if __name__ == "__main__": outer()
输出:
skus = {}
第二段测试代码
from pathos.multiprocessing import Pool as ProcessPool from multiprocessing import Manager def outer(): manager = Manager() skus = manager.dict() def process(sku): skus[sku] = sku * 10 with ProcessPool() as pool: pool.map(process, range(100), chunksize=3) print(skus) if __name__ == "__main__": outer()
错误输出:
.... raise AuthenticationError('digest sent was rejected') multiprocessing.context.AuthenticationError: digest sent was rejected
问题分析
普通字典无法共享的原因:
多进程间内存空间相互隔离,子进程启动时会复制主进程的字典对象,后续子进程对字典的修改仅作用于自身副本,主进程的原始字典不会被更新。标准库Manager报错的原因:
pathos.multiprocessing基于第三方multiprocess库实现(而非Python标准库的multiprocessing),两者的进程上下文和认证机制不兼容,直接混用标准库Manager会触发认证错误。
正确实现方法
方案一:通过返回值汇总结果(推荐)
避免共享对象,让子进程返回键值对,主进程统一合并到字典中,这种方式更安全且不易出问题:
from pathos.multiprocessing import Pool as ProcessPool def process(sku): return sku, sku * 10 def outer(): skus = {} with ProcessPool() as pool: results = pool.map(process, range(100), chunksize=3) skus.update(results) print(skus) if __name__ == "__main__": outer()
方案二:使用pathos兼容的共享字典
使用multiprocess库(pathos依赖的底层库)的Manager来创建共享字典,替代标准库的Manager:
from pathos.multiprocessing import Pool as ProcessPool from multiprocess import Manager # 注意这里是multiprocess而非multiprocessing def outer(): manager = Manager() skus = manager.dict() def process(sku): skus[sku] = sku * 10 with ProcessPool() as pool: pool.map(process, range(100), chunksize=3) print(dict(skus)) # 转换为普通字典便于查看 if __name__ == "__main__": outer()
内容的提问来源于stack exchange,提问作者Xiang
相关产品推荐
相关产品推荐

