Celery+Redis出现Received and deleted unknown message错误的解决求助
问题原因
你设置的reply_to="read"是告诉Celery把add任务的执行结果发送到read队列,但read队列的Worker只认标准的Celery任务消息(包含任务名称、参数等结构),而收到的是任务结果消息(结构是{'task_id':..., 'status': 'SUCCESS', 'result':...}),Worker识别不出这是一个合法任务,所以触发"Received and deleted unknown message"警告并删除消息。
你的需求是把add的结果作为参数传给read任务执行,不是用结果队列传递,得换正确的任务触发方式。
解决方案
方式一:在add任务内部调用read任务
修改add任务代码,在计算完成后直接调用read任务,把结果传进去:
@celery.task(name='add',acks_late=True) def add(x, y): result = x + y print(f"Order Complete!{x}, {y}") # 调用read任务,将计算结果作为参数传入 read.delay(result) return result
启动Worker时要指定监听add和read两个队列:
celery -A celery_worker worker -Q add,read --loglevel=info
方式二:使用Celery链式任务(Chain)
如果想在外部控制任务串联,用链式任务确保add执行完成后自动触发read:
from celery import chain # 链式调用:先执行add,再将add的结果传给read task_chain = chain(add.s(4,3), read.s()) task_chain.apply_async(queue='add')
这种方式下,Celery会自动在add任务完成后,把结果作为参数传给read任务,无需手动处理。
额外注意点
- 移除原来
add.apply_async里的reply_to="read"参数,这个参数是给Celery Backend用的,用于接收任务执行状态,不是用来触发下一个任务的。 - 确保Worker启动时监听了
add和read队列,否则任务会堆积无法执行。
内容的提问来源于stack exchange,提问作者Geetha SJ
相关产品推荐
相关产品推荐

