关于 Django 使用 celery 定时任务的奇葩现象

6 天前
 Hopetree

我使用 django-celery-beat 创建了一些定时任务,大概如图,但是很奇怪的是有 3 个任务没有按照预定的 crontab 规则执行,其他都正常。先排除任务本身的问题,以为我试过修改定时任务策略,没有执行的任务可以执行。

首先我说一下我的关键配置:

TIME_ZONE = 'Asia/Shanghai' USE_TZ = True CELERY_TIMEZONE = 'Asia/Shanghai' CELERY_ENABLE_UTC = True

也就是启用 UTC 时间,然后本地使用北京时间。

ChatGPT 一直让我排查时区问题,我也照做了,但是一直没解决,毕竟按照上面的现象,如果是时区问题,为什么其他的任务正常?我无法理解这个现象,特别是 9:50 执行的任务,其他 9:35 和 9:40 的都正常。

有人遇到过类似的问题吗?

(另外补充:我发现我把 9:50 的任务改成 9 点和 16 点两个时间都执行,这个任务就正常执行了。。。非常不理解)

1329 次点击
所在节点    程序员
14 条回复
misoomang
6 天前
可以查看下 django_celery_beat_periodictask 表中相关任务的数据情况

另外可以看下 celery-beat 的任务是否有在持续在指定时间发送 Scheduler: Sending due task xxx 的任务
RyougiShiki
6 天前
开日志排查。推荐个 django 定时任务库 https://digon.io/hyd/project/scheduler/t/master/readme.html ,简单、体验不错,小众 star 数少、暂时没发现大问题。
Hopetree
6 天前
@misoomang @RyougiShiki 日志我看了,我还开了 debug ,到了时间其他的任务是有发送任务给 work 的,但是上面没有执行就没有发送的日志,就感觉是完全没有触发一样,离谱至极
misoomang
6 天前
@Hopetree 表里的数据情况也是需要确认下,对应任务是否在表中。另外是不是一次性任务
lambdaq
6 天前
当你遇到一个任务调度问题,选 celery ,那么恭喜你,变成 2 个问题了。。。
ruanimal
6 天前
时区问题吧
cz5424
5 天前
如果 Docker 下要装时区依赖
fzjwdd
5 天前
```
enable_utc=False
```
改成这样试试。
Hopetree
5 天前
貌似发现了问题,是容器 Dockerfile 关于时区配置的操作问题,这是原本的操作:

RUN cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

这是让 ChatGPT 给的操作:
ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone

改完之后我发现定时任务能正常了,有点不理解,安装我之前的操作执行 date 命令也是北京时间啊,下面这个操作貌似就是多了两个信息,一个是 TZ 环境变量,然后是/etc/timezone 文件内容,貌似 celery 的时间处理会跟这两个有关?
julyclyde
5 天前
@Hopetree 处理时间和 TZ 有关是很理所当然的事情

而且其实你上述两个步骤其中之一就足够(当然,俩都做了也不算错)
Hopetree
5 天前
@julyclyde 感谢提醒,我后续的容器镜像都会按照上面的操作做,这次遇到的定时任务事情搞了我一个周末都没定位出来,虽然我也是一直是往时区方向排查,并且排查过容器本地的时区,只是一直不知道要去设置/etc/timezone
yb2313
5 天前
任务调度我选 dagaster
julyclyde
5 天前
@Hopetree 最好把其他的( celery 之外)所有容器都检查一下

之前听说过一些实践,所有后台全都 utc ,到和用户交互的时候再 locale
julyclyde
5 天前

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

https://ex.noerr.eu.org/t/1148300

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

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

© 2021 V2EX