我有一个主芹菜(在Django中)任务,它调用子任务prefetch
:
@shared_task
def main():
...
tasks.prefetch.s().delay(x)
Prefetch
本身会调用一些子任务:
@shared_task
def prefetch(x):
...
do_prefetch.s().delay(x)
在main
中,稍后在prefetch
被调用后,我会执行一些其他子任务来执行某些处理。这些子任务需要在prefetch
完成后执行。 Prefetch
本身需要一些时间,因此我不仅要在process
之后执行prefetch
个任务,还要延迟60秒。 Process
个任务不需要prefetch
的输出,只需要在完成后运行。 process
任务本身可以彼此并行运行。
@shared_task
def main():
...
tasks.prefetch.s().delay(x)
...
for i in range(10):
tasks.process.s().delay(i)
我看到Celery的画布命令应该能满足我的需求,但我不知道如何设置任务。以下是正确的吗?链只是通过创建链执行还是需要显式执行?我的倒计时参数是否在正确的位置并且意味着正确的事情(在预取后60秒随时执行此任务)?
prefetch = tasks.prefetch.s(x)
g = group(tasks.process.s(i, countdown=60) for i in range(10))
c = (prefetch | g)
c()
答案 0 :(得分:1)
您可以使用最适合您情况的chord
代替chain
。
prefetch_task = tasks.prefetch.s(x)
group_task = group(tasks.process.s((i), countdown=60) for i in range(10))
work_flow = chord([prefetch_task])(group_task)
<强> Chord 强>
和弦由标题和正文组成。标头是一组在调用回调之前必须完成的任务。和弦本质上是一组任务的回调。
示例:强>
>>> from celery import chord
>>> res = chord([add.s(2, 2), add.s(4, 4)])(sum_task.s())
此处它将首先处理两个add
任务,完成后将执行sum_task
。