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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 09:40:25