You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django Celery每日18:30定时任务不执行问题求助

解决Django+Celery每日18:30定时任务未触发的问题

碰到这种每分钟任务正常跑、但指定时间任务没触发的情况,大概率是时区配置或者任务注册的细节出了问题,我给你梳理几个关键排查点:

1. 优先检查时区配置(最可能的原因)

Celery默认使用UTC时区,如果你设置的18:30是本地时间,那实际在UTC时区下的触发时间会差好几个小时(比如东八区的18:30对应UTC的10:30),自然不会在你预期的时间执行。

修复步骤:

  • 在Django的settings.py里配置正确的本地时区:
    TIME_ZONE = 'Asia/Shanghai'  # 替换成你所在的时区,比如'Europe/London'
    USE_TZ = True
    
  • 在celery.py里同步Celery的时区,确保和Django一致:
    from django.conf import settings
    
    # ... 其他配置 ...
    celery_instance.conf.timezone = settings.TIME_ZONE
    

2. 优化任务注册方式,避免循环导入问题

你当前在celery.py里直接导入my_task,可能会导致循环导入(尤其是Django启动时),建议改用任务路径字符串的方式注册,更稳妥:

修改setup_periodic_tasks函数:

@celery_instance.on_after_configure.connect
def setup_periodic_tasks(sender, **kwargs):
    # 每日18:30执行的任务
    sender.add_periodic_task(
        crontab(minute=30, hour=18),  # day_of_week='*'可以省略,默认就是每天
        'my_app.tasks.my_task',  # 格式:[app名].[tasks模块名].[任务函数名]
        name='daily-1830-task',  # 给任务命名,方便日志排查
    )
    # 每分钟测试任务
    sender.add_periodic_task(
        crontab(minute='*/1'),
        'my_app.tasks.my_task',
        name='every-minute-test-task',
    )

3. 确认启动命令的正确性

确保你执行的Celery命令里的app_name是正确的:

  • 如果你的celery.py在名为my_app的Django应用目录下,启动命令应该是:
    celery -A my_app worker -B -l info
    
    其中-l info会输出详细日志,你可以在日志里搜索periodic task,确认18:30的任务是否被正确注册,以及显示的触发时间是否是你预期的本地时间。

4. 验证crontab参数格式

你的day_of_week='mon,tue,wed,thu,fri,sat,sun'可以简化为'*'(默认值),虽然这个不是问题,但保持简洁更好。另外确认hour=18和minute=30的写法没有错误(注意是整数,不是字符串)。

最后测试建议

修改配置后,重启Celery服务,查看info日志:

  • 如果日志里出现Adding periodic task daily-1830-task,说明任务已注册
  • 可以临时把定时任务改成当前时间的下一分钟(比如crontab(minute=datetime.now().minute+1, hour=datetime.now().hour)),验证是否能正常触发,快速确认配置是否有效。

内容的提问来源于stack exchange,提问作者rahul.m

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 03:43:26