Linux django 中使用 apscheduler 定时任务 数据库连接丢失问题

2019-12-27 17:53:43 +08:00
 wuwukai007
问题:windows 中定时任务是在加载 wsgi.py 之前 导入的,linux 中是在 wsgi.py 加载之后导入的,但是理论上定时任务都是在 django 的会话中的,不应该会存在数据库丢失情况啊!
4599 次点击
所在节点    Python
7 条回复
fhy1994
2019-12-27 18:07:53 +08:00
我是 docker 跑的 flask 单独起了一个容器跑 apscheduler
之前也遇到数据库丢失连接 因为我的定时任务是每天跑一次
代码加入 mysql Pre-ping 无效

后来写了个每 20 分钟去查下数据的定时任务
解决了 `MySQL server has gone away` 的问题
fhy1994
2019-12-27 18:15:33 +08:00
顺便问大家伙个问题 docker 跑的 apscheduler
每执行一次任务内存使用就会增加 容器内存占用会越来越大
用的 BlockingScheduler 模式
celery 也发现这问题
任务调用 gc.collect() 无效
est
2019-12-27 18:16:22 +08:00
如果不理解 WSGI 各个对象的生存周期,尽量不要乱塞东西到 urls.py 或者 wsgi.py 的全局变量里去。
wuwukai007
2019-12-27 18:16:42 +08:00
@fhy1994 django 的数据库连接 django 本身会维护,只是不知道是不是放在了 wsgi.py 的末行,django.setup 执行之后会导致没加载到 django 环境中?但是第一天执行了好奇怪。
youngce
2019-12-27 18:22:58 +08:00
@wuwukai007 #4 你的理解大概没有问题,你的数据库操作时间间隔太长,数据库已经抛弃了这个链接。django 在处理 request 时,会检查数据库连接是否存活,你大概是在脚本里调用了 django orm,所以没有这个操作。大概的解决办法,一种时你自己在调用 orm 时,实现 django 的数据库连接检查。另外一种就是,换 SQLAlchemy
wangyongbo
2019-12-27 18:33:19 +08:00
我用的 mysql, mysql 有个 wait_timeout, 一个连接 超过这个时间没有操作, 就被断开了。
所以我加了一个 异常捕获, 重新连接的代码, 也可以解决这个问题。
断开之后,重连
from django.db import connection
connection.connect()
meiyoumingzi6
2019-12-29 18:03:04 +08:00
升级 apscheduler 版本
可以去翻下 github 在某个版本修改了这个问题,
是没有及时删除旧连接导致的

明天上班给你看下是在哪个版本修复的(我们之前排查过这个问题…最后发现官方修了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/632956

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX