问题:windows 中定时任务是在加载 wsgi.py 之前 导入的,linux 中是在 wsgi.py 加载之后导入的,但是理论上定时任务都是在 django 的会话中的,不应该会存在数据库丢失情况啊!
1
fhy1994 2019-12-27 18:07:53 +08:00
我是 docker 跑的 flask 单独起了一个容器跑 apscheduler
之前也遇到数据库丢失连接 因为我的定时任务是每天跑一次 代码加入 mysql Pre-ping 无效 后来写了个每 20 分钟去查下数据的定时任务 解决了 `MySQL server has gone away` 的问题 |
2
fhy1994 2019-12-27 18:15:33 +08:00
顺便问大家伙个问题 docker 跑的 apscheduler
每执行一次任务内存使用就会增加 容器内存占用会越来越大 用的 BlockingScheduler 模式 celery 也发现这问题 任务调用 gc.collect() 无效 |
4
wuwukai007 OP |
5
youngce 2019-12-27 18:22:58 +08:00
@wuwukai007 #4 你的理解大概没有问题,你的数据库操作时间间隔太长,数据库已经抛弃了这个链接。django 在处理 request 时,会检查数据库连接是否存活,你大概是在脚本里调用了 django orm,所以没有这个操作。大概的解决办法,一种时你自己在调用 orm 时,实现 django 的数据库连接检查。另外一种就是,换 SQLAlchemy
|
6
wangyongbo 2019-12-27 18:33:19 +08:00
我用的 mysql, mysql 有个 wait_timeout, 一个连接 超过这个时间没有操作, 就被断开了。
所以我加了一个 异常捕获, 重新连接的代码, 也可以解决这个问题。 断开之后,重连 from django.db import connection connection.connect() |
7
meiyoumingzi6 2019-12-29 18:03:04 +08:00
升级 apscheduler 版本
可以去翻下 github 在某个版本修改了这个问题, 是没有及时删除旧连接导致的 明天上班给你看下是在哪个版本修复的(我们之前排查过这个问题…最后发现官方修了 |