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

Celery搭配PostgreSQL调用AsyncResult报错:无法适配AsyncResult类型

解决Celery PostgreSQL后端调用AsyncResult.ready()时的SQL适配错误

问题根源

从报错信息可以看到,SQL查询时将AsyncResult对象作为task_id参数传入,导致PostgreSQL无法适配该类型。问题出在调用代码的逻辑错误:long_running_task.delay()本身就返回AsyncResult实例,你却把这个实例赋值给id变量,再用它去创建新的AsyncResult,最终底层查询传递的是对象而非字符串类型的任务ID。

修复方案

方案1:直接使用delay返回的AsyncResult实例(推荐)

无需重复创建AsyncResult,直接使用delay()返回的实例即可:

from task_queue import long_running_task
import time

task = long_running_task.delay(5)
print(f"Task ID {task.id} queued")

while not task.ready():
    print("Waiting for task to complete")
    time.sleep(1)

方案2:若需单独创建AsyncResult,传入字符串类型的task_id

如果业务场景要求必须重新实例化AsyncResult,需从原AsyncResult中取出字符串类型的id属性传入:

from task_queue import long_running_task
from celery.result import AsyncResult
import time

original_task = long_running_task.delay(5)
print(f"Task ID {original_task.id} queued")
# 传入字符串类型的task_id,而非AsyncResult对象
task = AsyncResult(original_task.id, app=long_running_task.app)

while not task.ready():
    print("Waiting for task to complete")
    time.sleep(1)

额外验证点

  • 确保传递给AsyncResult的第一个参数是字符串类型的任务ID,而非AsyncResult对象
  • Celery v5.3.5的数据库后端对参数类型校验严格,而RPC后端因传输机制不同未触发该问题,属于预期差异

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 15:03:19