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

