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

