Celery:运行多个异步子任务会导致“从不调用result.get()”错误

时间:2019-03-19 15:36:39

标签: python celery

我正在尝试使用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()吗?一个任务触发N个(独立的)子任务是否完全可行?我查过类似的问题,但似乎没有一个人在做与我在这里完全相同的事情。

1 个答案:

答案 0 :(得分:0)

所以我环顾四周,我认为问题是我针对自己想做的事情采用了错误的策略。我想开始N个任务,然后报告它们是否起作用。但是,每个子任务已经向数据库报告了其状态,因此等待检查该结果只是使调用方无缘无故被阻塞。

我将功能更改为此:

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

就是这样。任务开始,调用函数退出,从而释放了工作人员。子任务正常运行,并且没有错误。仅当我尝试进行调用取决于获得每个子任务的结果时,我尝试执行的操作才有意义。