【问题标题】:Does a celery chain execute tasks in a specific order?芹菜链是否按特定顺序执行任务?
【发布时间】:2018-09-08 06:24:30
【问题描述】:

我有一个任务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()

【问题讨论】:

    标签: python celery


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      @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)
      

      任务将按顺序执行。

      【讨论】:

        猜你喜欢
        • 2021-12-16
        • 2013-02-19
        • 2017-09-30
        • 1970-01-01
        • 1970-01-01
        • 2017-04-11
        • 2017-09-18
        • 2021-05-15
        • 2014-12-04
        相关资源
        最近更新 更多