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

时间:2013-08-03 18:43:30

标签: python task celery message-queue

我是Celery的新手,我正在努力了解它是否可以解决我的问题。

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

现在到真实场景:

  • 任务An - 处理用户上传的文件(每个文件后添加) 已上传)
  • 任务B - 对处理所有内容的结果执行某些操作 上传的文件

欢迎替代解决方案

2 个答案:

答案 0 :(得分:0)

使用RabbitMQ,您可以使用message acknowledgmentaggregator pattern获得准确的行为。

启动工作人员,消费消息(A)并做一些工作(处理用户上传的文件),但不发送ack等结束了。相反,它需要下一个消息形式队列,如果它再次成为A任务,他正在做同样的事情。在某些时候,他将收到任务B并可以处理所有以前的A个结果,所有atones并将ack发送给所有人。

不幸的是,这种情况无法通过Celery完成,因为您必须指定所有 A任务和最终B任务(链,和弦,关于创建时间的回调等。)。

或者,您可以在单独的队列(而不是Celery队列)中为每个成功的Task.id任务保存A并在执行B任务时处理此消息。芹菜可以适合这种算法。

答案 1 :(得分:0)

肯定你可以做到这一点,芹菜画布支持许多选项,包括你需要的行为,在一组任务后运行任务......它被称为“和弦”,例如:< / p>

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链接了解详情