如何在其他(已启动)任务完成后运行任务

我是Celery的新手,我试图了解它是否可以解决我的问题。如何在其他(已启动)任务完成后运行任务

我需要启动一些任务(An),然后在完成这些任务后运行另一个任务(B)。问题在于任务An是按顺序添加的,我不想在开始第一个之前等待最后一个添加。在任务An完成后,我可以配置任务B执行吗?

我们在真实的情景:

  • 任务An - 处理由用户上载的文件(由每个文件 上传后)
  • 任务B - 做处理所有 的上传结果的东西文件

替代方案亦欢迎

回答:

使用RabbitMQ,您可以使用message acknowledgment和aggregator pattern获得确切的行为。

您启动工作,消耗消息(A),并做了一些工作(用户你的情况上传文件的过程),但完成时,不会发送ack。相反,它需要下一个消息表单队列,并且如果它再次执行任务,他正在做同样的事情。在某个时间点,他将收到任务B,并且可以处理所有以前的A的结果,并将所有结果发送给ack

不幸的是,这种情况下不能与芹菜做,因为你必须指定创建时间都A任务和最终B任务(链,和弦,回调等)。

或者,也可以执行任务B时节省Task.id在单独的队列(未芹菜队列)和处理此信息,每条成功A任务。芹菜可以适合这种算法。

回答:

为了确保你能做到这一点,芹菜帆布支持的许多选项,inluding您所需要的行为,一组任务后运行的任务......它被称为“和弦”,如:

from celery import chord 

from tasks import task_upload1, task_upload2, task_upload3, final_execution

result = chord(task_upload1.s(), task_upload2.s(), task_upload3.s())(final_execution.s())

get_required_result = result.get()

你可以参考this链接了解更多详情

以上是 如何在其他(已启动)任务完成后运行任务 的全部内容, 来源链接: utcz.com/qa/258440.html

回到顶部