【问题标题】:Celery AsyncResult does not have parentsCelery AsyncResult 没有父母
【发布时间】:2021-06-05 11:24:09
【问题描述】:

我提交了 3 个链接在一起的任务。然后我返回链的 id,稍后我将尝试访问结果

from celery.result import AsyncResult
from my_celery impor app

def get_results(task_id):
    result = AsyncResult(task_id, app=app)
    if result.ready():
        return result.get()
    return result.state

此 AsyncResult 是链中最后一个任务的结果。它也没有连锁父母。

这是一个错误还是我做错了什么?

【问题讨论】:

  • 你检查过children结果的属性吗?
  • 是的,它是空的。似乎 parent 和 children 属性不包含链中的其他任务,而是仅包含从该任务提交的任务。我面临的问题是,仅知道链中最后一个任务的 id,无法确定链的状态(它仍然是 PENDING 还是实际上 FAILED)。

标签: python python-3.x celery celery-task


【解决方案1】:

根据此处的答案(这可能是一种过时的方法)-Get progress from async python celery chain by chain id,它提到了以下内容:

您不能仅从任务 ID 中恢复父链,您必须遍历您的队列,这可能会也可能不会,具体取决于您用作代理的方式。

在这种情况下,您必须按照该答案中建议的方法进行操作。但从我在AsyncResult()docs 中看到的内容来看,您应该能够将父参数作为参数传递,并且它应该保存孩子的父值。它默认以None 传递,从方法签名中可以看出。

class celery.result.AsyncResult(id, backend=None, task_name=None, app=None, parent=None)

【讨论】:

  • 当链中的每个任务都依赖于之前的任务时,无法跟踪链状态实际上很奇怪。需要手动检查每个任务并验证其状态。
  • 我明白了。我对芹菜并不完全熟悉,所以我能找到的只有这些。问题解决了吗?
  • 好的,谢谢。我已经有了一种解决方法,可以保存所有任务 ID 而不是一个,并且状态是根据所有任务状态决定的。只要链相对简单,这可以正常工作。尽管如此,还是要深入研究一下,因为对我来说,这个功能似乎很方便,虽然我可能看不到全貌,因为我还是个芹菜菜鸟。
猜你喜欢
  • 2019-06-09
  • 1970-01-01
  • 2012-11-22
  • 1970-01-01
  • 2019-07-18
  • 2015-09-12
  • 1970-01-01
  • 2014-09-20
  • 2013-06-13
相关资源
最近更新 更多