解决 “_pickle.PicklingError: Can‘t pickle: it‘s not the same object as sqlalchemy.orm.session.Session“
问题背景
在一个使用 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 服务,也不会碰到这个问题,但记录下总没错。
© 版权声明
文章版权归作者所有,未经允许请勿转载。
相关文章
暂无评论...


