解决 “_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 服务,也不会碰到这个问题,但记录下总没错。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值