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
相关产品推荐
相关产品推荐

