我是Celery的新手,我正在努力了解它是否可以解决我的问题。
我需要启动一些任务(An
),然后在完成这些任务后运行另一个任务(B
)。问题是任务An
是按顺序添加的,我不想在开始第一个之前等待最后一个添加。我可以将任务B
配置为在完成任务An
后执行吗?
现在到真实场景:
An
- 处理用户上传的文件(每个文件后添加)
已上传)B
- 对处理所有内容的结果执行某些操作
上传的文件欢迎替代解决方案
答案 0 :(得分:0)
使用RabbitMQ,您可以使用message acknowledgment和aggregator 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链接了解详情