我有一个任务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()
答案 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)
任务将按顺序执行。