我正在尝试使用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个(独立的)子任务是否完全可行?我查过类似的问题,但似乎没有一个人在做与我在这里完全相同的事情。
答案 0 :(得分:0)
所以我环顾四周,我认为问题是我针对自己想做的事情采用了错误的策略。我想开始N个任务,然后报告它们是否起作用。但是,每个子任务已经向数据库报告了其状态,因此等待检查该结果只是使调用方无缘无故被阻塞。
我将功能更改为此:
job = group(tasks) if len(tasks) == 1 else group(*tasks)
job.apply_async()
就是这样。任务开始,调用函数退出,从而释放了工作人员。子任务正常运行,并且没有错误。仅当我尝试进行调用取决于获得每个子任务的结果时,我尝试执行的操作才有意义。