如何在其他(已启动)任务完成后运行任务
我是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