Celery Worker接收任务后延迟5分钟执行的问题咨询
解决Celery定时任务延迟执行的问题
嘿,我仔细看了你的日志,立马就找到问题根源了——你的任务被设置了ETA(预计执行时间),这就是Worker在15:05收到任务,却拖到15:10才执行的核心原因!
从日志里的这条关键信息就能确认:
[2018-05-11 15:05:00,501: INFO/MainProcess] Received task: mimir.core.task.batch_send_share_message.batch_send_member_sent_share_template_message[53e836d3-ac94-42f5-b79e-c525d5e43b15] ETA:[2018-05-11 15:10:00.170054+08:00]
这个ETA字段明确告诉我们,任务被调度时就被指定了要在15:10才执行,哪怕Worker早就收到了任务,也会等到这个时间点才启动。
可能的原因
- 你在配置Celery Beat定时任务时,不小心给任务加了
countdown=300(5分钟等于300秒)或者eta相关的参数,导致每次调度都额外叠加了5分钟延迟; - 任务函数内部或者调用任务的代码里,主动用
apply_async设置了延迟执行的参数。
解决方案
检查Celery Beat的调度配置
打开你的Beat配置文件,看看是不是像下面这样多了多余的延迟配置:CELERY_BEAT_SCHEDULE = { 'batch-send-template-task': { 'task': 'mimir.core.task.batch_send_share_message.batch_send_member_sent_share_template_message', 'schedule': 300.0, # 每5分钟调度一次 'args': (), 'options': {'countdown': 300} # 这里就是罪魁祸首! } }把
'options': {'countdown': 300}这一行删掉就好。检查任务调用代码
看看有没有地方用类似下面的方式调用任务:batch_send_member_sent_share_template_message.apply_async(countdown=300)如果有,去掉
countdown=300参数,让任务被调度后立即执行。重启服务生效
修改配置后,记得重启Celery Beat和Worker进程,确保新的配置被加载。
验证修复
等下一次任务调度时,再看日志如果收到任务的记录里没有ETA字段,或者ETA时间和任务接收时间一致,就说明问题已经解决啦!
内容的提问来源于stack exchange,提问作者cong
相关产品推荐
相关产品推荐

