Celery Worker未正常执行Beat下发的定时任务求助
问题:Celery Worker接收任务但不执行,定时任务无输出
环境与配置
- Django项目集成Celery + Redis,已安装
celery、django-celery-beat并完成配置 - 定时任务为发送Telegram消息,手动触发任务时Telegram消息发送正常,但Beat调度后Worker接收任务却不执行
任务代码
import logging from celery import shared_task from borrowings.telegram_helpers import send_telegram_notification logger = logging.getLogger(__name__) @shared_task def send_hi(): logger.info("Sending hi!") message = "Hi!" send_telegram_notification(message)
操作步骤
- 启动Redis:
D:\Redis>redis-server.exe - 启动Worker:
LibraryService worker -l info - 启动Beat:
celery -A LibraryService beat -l info
日志情况
Beat日志(正常下发任务)
2023-07-31 02:51:14,974 [INFO] beat: Starting... 2023-07-31 02:51:15,001 [INFO] Scheduler: Sending due task send_hi (borrowings.tasks.send_hi) 2023-07-31 02:52:14,997 [INFO] Scheduler: Sending due task send_hi (borrowings.tasks.send_hi) 2023-07-31 02:53:14,998 [INFO] Scheduler: Sending due task send_hi (borrowings.tasks.send_hi) 2023-07-31 02:54:14,998 [INFO] Scheduler: Sending due task send_hi (borrowings.tasks.send_hi) 2023-07-31 02:55:14,999 [INFO] Scheduler: Sending due task send_hi (borrowings.tasks.send_hi) 2023-07-31 02:56:14,999 [INFO] Scheduler: Sending due task send_hi (borrowings.tasks.send_hi)
Worker日志(接收任务但无执行日志)
2023-07-31 02:51:04,640 [INFO] mingle: searching for neighbors 2023-07-31 02:51:05,176 [INFO] child process 20816 calling self.run() 2023-07-31 02:51:05,278 [INFO] child process 1748 calling self.run() 2023-07-31 02:51:05,284 [INFO] child process 21456 calling self.run() 2023-07-31 02:51:05,325 [INFO] child process 19108 calling self.run() 2023-07-31 02:51:05,338 [INFO] child process 23508 calling self.run() 2023-07-31 02:51:05,345 [INFO] child process 22716 calling self.run() 2023-07-31 02:51:05,398 [INFO] child process 18304 calling self.run() 2023-07-31 02:51:05,428 [INFO] child process 20284 calling self.run() 2023-07-31 02:51:05,668 [WARNING] D:\projects\django\LibraryService\venv\Lib\site-packages\celery\app\control.py:56: DuplicateNodenameWarning: Received multiple replies from node name: celery@Dmytry. 2023-07-31 02:54:15,000 [INFO] Task borrowings.tasks.send_hi[e752e4ec-cfbe-49a8-8af3-81baef67845e] received 2023-07-31 02:54:15,842 [INFO] child process 21376 calling self.run() 2023-07-31 02:54:15,842 [INFO] child process 1416 calling self.run() 2023-07-31 02:54:15,842 [INFO] child process 1468 calling self.run() 2023-07-31 02:54:15,844 [INFO] child process 1204 calling self.run() 2023-07-31 02:54:15,854 [INFO] child process 21108 calling self.run() 2023-07-31 02:56:15,001 [INFO] Task borrowings.tasks.send_hi[87dfe9ca-efbb-4349-81de-52ae60bb84e2] received 2023-07-31 02:56:15,855 [INFO] child process 12220 calling self.run()
排查方案
1. 解决Worker节点名重复问题
日志中出现DuplicateNodenameWarning,说明存在多个同名Worker节点,可能导致任务分配异常。
- 停止所有Worker进程,确保没有残留的Worker在后台运行
- 启动Worker时指定唯一节点名:
celery -A LibraryService worker -l info -n worker1@%h
2. 检查Celery与Redis的连接配置
确认settings.py中Celery的Broker和Backend配置是否正确,确保Worker和Beat使用同一个Redis实例:
CELERY_BROKER_URL = 'redis://localhost:6379/0' CELERY_RESULT_BACKEND = 'redis://localhost:6379/0'
- 验证Redis连接:在Django shell中执行
from celery import current_app; current_app.connection().connect(),查看是否有连接错误
3. 检查任务序列化配置
如果任务参数(或任务本身)序列化方式不兼容,可能导致Worker无法解析任务:
在settings.py中显式指定序列化方式:
CELERY_TASK_SERIALIZER = 'json' CELERY_ACCEPT_CONTENT = ['json'] CELERY_RESULT_SERIALIZER = 'json'
4. 测试手动触发任务
在Django shell中手动触发任务,观察Worker是否执行:
from borrowings.tasks import send_hi send_hi.delay()
如果手动触发也不执行,说明任务本身或Worker配置存在问题;如果手动执行正常,问题可能出在Beat与Worker的任务路由或调度配置。
5. 检查任务路由与队列配置
- 确认Beat调度的任务是否发送到了Worker监听的队列
- 启动Worker时显式指定队列:
celery -A LibraryService worker -l info -Q default - 检查
settings.py中是否自定义了队列路由,确保任务被分配到正确队列
6. 升级Celery与依赖版本
版本不兼容可能导致此类问题,尝试升级到稳定版本:
pip install --upgrade celery django-celery-beat redis
7. 检查日志级别与配置
确认Worker的日志级别是否足够,或者任务中的logger是否配置正确:
- 在任务中添加更底层的打印语句(如
print("Sending hi!")),排除日志配置问题 - 检查Django的
settings.py中日志配置是否包含了Celery任务的logger
内容的提问来源于stack exchange,提问作者Dmytry Bondariev
相关产品推荐
相关产品推荐

