芹菜:链接子任务

时间:2014-09-10 05:23:53

标签: django celery django-celery

我有一个主芹菜(在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()

1 个答案:

答案 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