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

Celery任务无报错但未执行,无法获取结果求助

问题排查:Celery+Redis无法获取任务结果

为工作开发LLM助手队列系统,无队列经验选用Redis和Celery,直接集成应用后无法通过任务ID获取结果,编写仅含单个函数的测试应用后问题依旧。

测试代码(app.py)

import time

from flask import Flask, request
from celery import Celery, Task

from logging import Logger
logger = Logger("testcelery", level="INFO")

app = Flask(__name__)
app.config.from_mapping(
    CELERY=dict(
        broker_url="redis://localhost:6379/0",
        result_backend="redis://localhost:6379/0"
    ),
)

celery = Celery(app.name)
celery.config_from_object(app.config["CELERY"])
celery.set_default()
app.extensions["celery"] = celery


@celery.task
def useless_trash(name: str) -> str:
    time.sleep(10)
    return f"Hello {name}"


@app.route('/', methods=["POST"])
def post_task() -> tuple:
    task = useless_trash.delay(request.args.get("name"))
    logger.info(task)
    return {"task_id": task.id}, 200


@app.route('/<task_id>', methods=["GET"])
def get_task(task_id: str) -> tuple:
    task = celery.AsyncResult(task_id)
    logger.info(task)
    if not task.ready():
        return {"status": "Task not found"}, 404
    if task.state == "PENDING":
        return {"status": "Processing"}, 200
    elif task.state == "SUCCESS":
        return {"status": "Complete", "result": task.get()}, 200
    else:
        return {"status": "Error", "message": str(task.info)}, 500


@app.route("/", methods=["GET"])
def index():
    return "Hello, I am working."


if __name__ == '__main__':
    app.run()

环境配置

  • Redis运行在Docker容器中
  • 启动Celery Worker:celery -A app.celery worker -c 5 -l DEBUG
  • 启动Celery Beat:celery -A app.celery beat -l DEBUG
  • 启动Flask服务:flask run

现象

  • 所有命令行无报错
  • 发送任务后Celery Worker日志显示已接收任务,Redis的celery键下存在任务数据
  • Celery Beat无日志输出
  • 通过任务ID查询时始终返回“Task not found”,任务未被处理且一直留存于Redis中

排查方向

  • 修正任务状态判断逻辑:当前代码中if not task.ready()直接返回404是错误逻辑。task.ready()返回False仅表示任务未完成(可能处于PENDING、STARTED等状态),并非任务不存在。应先判断task.state == 'PENDING'是否属于未注册任务,再做状态返回。
  • 验证配置一致性:确认Flask应用和Celery Worker使用完全相同的broker、result_backend配置,检查Redis数据库编号是否一致,Docker容器的Redis是否正确映射端口,localhost是否能正常访问容器内Redis。
  • 移除不必要的Celery Beat:当前测试无定时任务,无需启动Beat,Beat无日志是正常现象,关闭Beat可排除干扰。
  • 查看Redis任务元数据:用redis-cli连接Redis,执行KEYS "*"找到对应任务ID的元数据键(格式通常为celery-task-meta-<task_id>),用GET命令查看任务实际状态。
  • 确认Worker实际处理情况:检查Worker日志是否有任务执行、完成的记录(如Task useless_trash[<task_id>] succeeded in 10s: 'Hello xxx'),若只有接收日志无后续记录,需排查Worker进程是否卡住或任务函数有隐性错误。
  • 验证版本兼容性:确认Flask与Celery版本匹配,部分新版本Celery对配置项格式有调整,可查阅对应版本文档确认配置正确性。
  • 测试任务函数本身:在Worker环境中直接调用useless_trash("test"),确认函数能正常返回结果,排除函数自身问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 11:57:46