【问题标题】:Celery: running multiple async subtasks causes "never call results.get()" errorCelery:运行多个异步子任务导致“从不调用 results.get()”错误
【发布时间】:2019-03-19 15:36:38
【问题描述】:

我正在尝试使用 Celery 运行多个异步作业,虽然函数的行为正常,但我不断收到以下错误:

RuntimeWarning: Never call result.get() within a task! See http://docs.celeryq.org/en/latest/userguide/tasks.html#task-synchronous-subtasks

即使我从不调用 results.get()。我的程序的工作方式是 Celery 订阅了一个队列,从而启动了一项管理任务。根据消息的内容,它会设置 1 个或多个子任务并将它们作为异步组运行,然后等待它们完成:

    job = group(tasks) if len(tasks) == 1 else group(*tasks)
    result = job.apply_async()

    # Wait for jobs to finish.
    cycles = 0
    while not result.ready() and cycles < (timeout / step):
        time.sleep(step)
        cycles += 1

    if not result.successful():
        return False
    return True

这些是否隐式调用results.get()?让 1 个任务触发 N 个多个(独立的)子任务是否可行?我查找了类似的问题,但似乎没有一个与我在这里做的事情完全相同。

【问题讨论】:

    标签: python celery


    【解决方案1】:

    所以我环顾四周,我认为问题在于我对我想做的事情应用了错误的策略。我想启动 N 个任务,然后报告它们是否有效。然而,每个子任务已经向数据库报告了它的状态,所以等待检查只是让调用的工作人员无缘无故地被阻塞。

    我把函数改成这样了:

        job = group(tasks) if len(tasks) == 1 else group(*tasks)
        job.apply_async()
    

    就是这样。任务开始,调用函数退出,释放工作者。子任务正常运行,我没有收到错误。只有当我尝试调用取决于获取每个子任务的结果时,我尝试做的事情才有意义。

    【讨论】:

      猜你喜欢
      • 2021-10-10
      • 2015-11-22
      • 1970-01-01
      • 2015-11-02
      • 2011-04-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-10
      相关资源
      最近更新 更多