Python multiprocessing调用Gambit返回NashProfile时pickle序列化报错
错误原因
Python标准库multiprocessing的进程间通信依赖pickle协议完成对象序列化:子进程执行完任务返回结果时,会先对返回对象做序列化再传输给主进程,主进程再反序列化得到最终结果。
你遇到的报错是因为Gambit库的NashProfile属于底层C扩展实现的自定义对象,其内部的self.profile属性没有实现pickle序列化要求的接口,导致序列化失败。
解决方法
提供两种可直接落地的方案,优先选择第一种:
- 方案1:修改任务函数返回原生Python类型(最优)
不要返回NashProfile对象本身,在子进程的find_nash函数中,拿到NashProfile结果后直接提取需要的策略数值,转为Python原生的列表、元组等可序列化类型再返回。
修改示例:
def find_nash(f): # 原有计算逻辑,得到nash_profs为NashProfile对象列表 nash_profs = 原有求解逻辑(f) # 新增序列化转换逻辑 serializable_res = [] for prof in nash_profs: # 把每个玩家的策略转为普通列表 converted_prof = [list(player_strategy) for player_strategy in prof] serializable_res.append(converted_prof) # 只返回原生类型组成的结果 return ('Polynomial Systems Method: ', serializable_res)
该方案无额外依赖,性能损耗最小,是首选方案。
- 方案2:替换为支持更强序列化能力的多进程库(兼容不改原函数)
如果需要保留NashProfile对象的完整结构,不想修改原find_nash的返回逻辑,可以用基于dill序列化的multiprocess库代替标准库的multiprocessing,dill支持序列化绝大多数Python对象,包括大部分C扩展实现的自定义类型:
- 安装依赖:
pip install multiprocess - 仅修改导入语句即可,原有并行代码完全不用调整:
# 替换原来的 import multiprocessing as mp import multiprocess as mp
内容的提问来源于stack exchange,提问作者manuelmontesinos
相关产品推荐
相关产品推荐

