V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
Hopetree
V2EX  ›  程序员

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

  •  
  •   Hopetree ·
    Hopetree · 4 天前 · 1242 次点击

    我使用 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 点两个时间都执行,这个任务就正常执行了。。。非常不理解)

    14 条回复    2025-07-29 16:03:58 +08:00
    misoomang
        1
    misoomang  
       4 天前   ❤️ 1
    可以查看下 django_celery_beat_periodictask 表中相关任务的数据情况

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

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

    之前听说过一些实践,所有后台全都 utc ,到和用户交互的时候再 locale
    关于   ·   帮助文档   ·   自助推广系统   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1063 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 18:28 · PVG 02:28 · LAX 11:28 · JFK 14:28
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.