Celery Worker接收任务却未执行处理,求排查原因
Celery任务接收后无结果输出的原因及解决办法
核心原因分析
任务未主动打印结果
你的add函数仅通过return返回结果,但Celery Worker默认不会将函数返回值自动输出到日志中——return的结果只会发送到结果后端(如果配置的话),不会主动打印到控制台日志。结果后端未配置
从Worker启动日志可见.> results: disabled://,说明未配置result_backend。当结果后端禁用时,Celery不会记录任务执行状态,也不会输出任务执行完成的日志(如Task tasck.add[xxx] succeeded in 5s: return is xxx这类日志)。
解决步骤
1. 在任务中主动输出结果
修改任务函数,加入日志打印或直接print操作,让结果出现在Worker日志里:
from celery import Celery from time import sleep import logging # 初始化日志 logging.basicConfig(level=logging.INFO) logger = logging.getLogger(__name__) app = Celery('tasck', broker='amqp://**_dev:***@204.***.***.43:5**2/ed_dev') @app.task def add(x, y): sleep(5) z = x + y result_msg = f"return is {z}" logger.info(result_msg) # 推荐用日志打印,也可以用print(result_msg) return result_msg
2. 配置结果后端
给Celery实例添加result_backend配置,这样Worker会输出任务完成的状态日志,同时你也可以在调用端获取任务结果。比如用RabbitMQ作为结果后端:
app = Celery('tasck', broker='amqp://**_dev:***@204.***.***.43:5**2/ed_dev', backend='amqp://**_dev:***@204.***.***.43:5**2/ed_dev')
如果有Redis,也可以用Redis作为结果后端(性能更优):
app = Celery('tasck', broker='amqp://**_dev:***@204.***.***.43:5**2/ed_dev', backend='redis://你的Redis地址:端口/数据库编号')
3. 确保Worker日志级别足够
启动Worker时,指定日志级别为INFO(默认就是INFO,但可以显式指定):
celery -A tasck worker -l INFO
完成以上操作后,Worker接收到任务执行完成时,会在日志中看到你打印的结果,以及Celery输出的任务成功日志。
内容的提问来源于stack exchange,提问作者Fabio Zorzetto
相关产品推荐
相关产品推荐

