芹菜链是否按特定顺序执行任务?

时间:2018-03-29 10:22:04

标签: python celery

我有一个任务task_main,可以调用其他任务。但我需要它们按特定顺序执行。

Celery文档说使用.delay()get()一个接一个地调用它们。

http://docs.celeryproject.org/en/latest/userguide/tasks.html#avoid-launching-synchronous-subtasks

使用链是否按顺序运行它们?我在文档中找不到这个。

@shared_task
def task_a():
    pass

@shared_task
def task_b():
    pass

@shared_task
def task_b():
    pass

@shared_task
def task_main():
    chain = task_a.s() | task_b.s() | task_c.s()
    chain()

2 个答案:

答案 0 :(得分:0)

是的,如果您使用链条任务将一个接一个地运行。 以下是正确的文档:http://docs.celeryproject.org/en/latest/userguide/canvas.html#chains

答案 1 :(得分:0)

也许是python数据科学ETL管道之后的一个更具体的例子,基本上,我们从数据库中提取数据,然后将数据转换为预期的方式,然后将数据加载到结果后端:

@app.task(base=TaskWithDBClient, ignore_result=True)
def extract_task(user_id):
    """Extract data from db w.r.t user."""
    data = # some db operations ...
    return data

@app.task()
def transform_task(data):
    """Transform input into expected form."""
    data = .... # some code
    # the data will be stored in result backend
    # because we didn't ignore result.
    return data

@app.task(ignore_result=True)
def etl(user_id):
    """Extract, transform and load."""
    ch = chain(extract_task.s(user_id),
           transform_task.s())()
    return ch

返回主应用程序,您只需致电:

etl.delay(user_id)

任务将按顺序执行。