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

Django+Celery示例任务已接收但始终无法完成,求排查方案

Celery Worker接收任务但不执行的排查方案

以下是针对你遇到的Celery Worker接收任务但从未完成、res.ready()始终返回False问题的排查步骤:

1. 确认Result Backend配置

Celery需要配置结果后端才能让客户端获取任务状态和结果。如果官方示例未默认配置,需在proj/settings.py中添加:

# 用RabbitMQ作为结果后端
CELERY_RESULT_BACKEND = 'rpc://'
# 或用Redis(需先安装redis和celery[redis]依赖)
# CELERY_RESULT_BACKEND = 'redis://localhost:6379/0'

配置后重启Worker和Django shell,再测试任务。

2. 检查任务执行日志

修改demoapp/tasks.py中的add任务,添加日志输出,确认任务是否真正开始执行:

from celery.utils.log import get_task_logger
from celery import shared_task

logger = get_task_logger(__name__)

@shared_task
def add(x, y):
    logger.info(f"开始执行add任务:x={x}, y={y}")
    result = x + y
    logger.info(f"add任务执行完成,结果:{result}")
    return result

重启Worker后发送任务,查看Worker日志:

  • 若无任何输出:任务未进入执行环节,需检查Worker调度逻辑
  • 只有第一行无第二行:任务执行到某一步被阻塞,需排查任务代码是否有死循环、阻塞调用

3. 验证Worker资源与并发设置

尝试强制Worker以单进程模式启动,排除并发调度问题:

celery -A proj worker -l INFO -c 1

若单进程模式下任务能正常完成,说明多并发场景下存在资源竞争或限制,需检查机器/容器的CPU、内存资源是否充足。

4. 检查RabbitMQ消息状态

登录RabbitMQ管理后台(默认地址http://localhost:15672,账号guest/guest):

  • 进入Queues页面,查看对应队列的Unacked消息数
  • 若Unacked数大于0,说明Worker已获取任务但未发送确认,可能是Worker进程异常、网络中断或任务执行时未正常退出

5. 确认环境依赖一致性

确保Worker启动的环境与Django项目依赖完全一致:

# 在项目根目录执行
pip install -r requirements.txt

尤其注意Celery、Django、kombu等核心依赖的版本是否匹配,版本不兼容可能导致任务执行异常。

6. 核对任务ID匹配性

在Django shell中打印任务ID:

res = add.delay(2,3)
print(res.id)

对比Worker日志中接收的任务ID,确认是同一任务,排除旧任务堆积导致的混淆。


内容的提问来源于stack exchange,提问作者StuffHappens

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 01:15:55