【问题标题】:django: Celery how to get a list of task results by their idsdjango:Celery 如何通过 id 获取任务结果列表
【发布时间】:2015-07-30 15:41:35
【问题描述】:

想看看有没有办法优化 celery 任务结果检查的过程。

例如,我有以下代码:

for task_id in tasks: # tasks is a list of celery task ids
    res = app.AsyncResult(task_id)
    if res.successful():
        tasks_ids[task_id] = res.result # here I am storing task results

当前方法的问题是我必须循环遍历 celery 任务并一一检查它们。除了我使用数据库结果后端之外,它还会为每个 celery taskid 生成一个查询(至少我是这么认为的)。

所以我想检查是否有办法一次检索所有结果?在那儿。是否有使用列表操作的 app.AsyncResult() 模拟?

【问题讨论】:

    标签: python django celery


    【解决方案1】:

    Celery 有一个 ResultSet 类来处理这个问题,它有 "join()" 和 "native_join()" 方法来做到这一点。 正如文档所说,有一个缺点,数据库后端没有实现“native_join()”(这些后端确实实现了它:amqp、Redis 和缓存),因为 ResultSet 可能非常昂贵,类似于您当前的方法。顺便说一句,我认为您可以查看文档和 API,看看是否找到可以帮助您的东西。 我不知道将这种支持添加到数据库后端有多难(您需要像the API says 所说的那样实现“get_many()”。但是,您可以评估更改后端。

    希望对你有帮助!

    【讨论】:

    • 看起来 ResultSet 接受了一个结果对象列表。我想知道像 ResultSet([app.AsyncResult(task_id) for task_id in task_ids]) 这样的操作是否也会是昂贵的操作
    • @Oleg-tarasenko,是的,它确实接受结果列表。在您显式调用某个方法之前,AsyncResult 是“惰性的”。从技术上讲,在执行 AsyncResult._get_task_meta() 之前,“_get_task_meta()”会调用“AsyncResult.backend.get_task_meta()”,因为它会执行繁重的操作。
    猜你喜欢
    • 2018-04-15
    • 2021-01-02
    • 1970-01-01
    • 2018-07-29
    • 2015-08-25
    • 2017-02-20
    • 2018-02-24
    • 2020-09-22
    • 1970-01-01
    相关资源
    最近更新 更多