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

如何在Python pathos.multiprocess多进程中正确共享字典?

Python pathos多进程中共享字典的问题与解决方法

问题概述

能否在Python的pathos.multiprocessing多进程环境中共享字典变量?尝试两段代码均未成功:

  1. 使用普通字典,执行后主进程的skus仍为空,未得到预期的{0:0,1:1,…}结果;
  2. 改用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

问题分析

  1. 普通字典无法共享的原因:
    多进程间内存空间相互隔离,子进程启动时会复制主进程的字典对象,后续子进程对字典的修改仅作用于自身副本,主进程的原始字典不会被更新。

  2. 标准库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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 10:35:48