问题背景
在一个使用 fastapi 框架的 web 项目调试过程中,遇到了一个有关多进程参数序列化的问题。session 对象作为参数传子进程时时报”_pickle.PicklingError: Can’t pickle : it’s not the same object as sqlalchemy.orm.session.Session”,网上基本查不到直接的解决方式,我查了很多资料,终于得以解决。
问题分析
非常感谢这篇介绍 mod_wsgi 的文档帮助我解决了问题,这里我给出文档链接。
文档主要讲的是 WSGI 应用使用重载参数启动时,会导致对象重新创建,使原始的对象丢失,这样 pick 序列化原始对象时会找不到该对象导致报错,这是 WSGI 应用在开启重载时的通病。
解决方法
在启动 WSGI 应用时,去掉 “—reload” 参数。
总结反思
文档最后给出了建议,在 WSGI 应用中如需用到 pickle 进行序列话,要尽量使用 python 的基本类型,比如列表、字典、元组等,以免出现一些玄学问题。不过如果不是在调试阶段会用 “—reload” 来启动 web 服务,也不会碰到这个问题,但记录下总没错。