解决 “_pickle.PicklingError: Can‘t pickle: it‘s not the same object as sqlalchemy.orm.session.Session“

内容分享2个月前发布
2 0 0
全能 AI 聚合平台 免费

一站式接入主流 AI 大模型,支持对话 · 生图 · 生视频,即开即用

ChatGPT Claude Gemini Grok DeepSeek 通义千问 Ollama
AI对话 AI生图 AI视频
免费使用 →

问题背景

在一个使用 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 服务,也不会碰到这个问题,但记录下总没错。

© 版权声明

相关文章

暂无评论

none
暂无评论...