【问题标题】:Why do we need Signatures in Celery?为什么我们需要 Celery 中的签名?
【发布时间】:2018-06-14 09:27:16
【问题描述】:

我已经开始在我的 Django Python 项目中使用 Celery 4.1 并且遇到了签名。

documentation 中它说:

您刚刚学习了如何使用调用指南中的任务延迟方法来调用任务,这通常是您所需要的,但有时您可能希望将任务调用的签名传递给另一个进程或作为参数另一个函数。

signature() 封装了单个任务调用的参数、关键字参数和执行选项,使其可以传递给函数,甚至可以序列化并通过网络发送。

虽然我在一些示例中看到了它们,但我真的不知道何时以及为什么要使用它们,以及它们解决了哪些问题。 谁能给外行解释一下?

【问题讨论】:

    标签: python django celery signatures


    【解决方案1】:

    您可以将 Celery 中的签名视为运行任务的占位符。例如,假设您希望构建一个由和弦、组和链组成的复杂工作流,并在不同的代码中使用它。在这种情况下,定义各种任务签名并根据需要将它们放入您的工作流程中会更容易:

    def create_workflow():
        return chord([sig_1, sig_2, chain([sig_3, sig_4])], 
            body=group([sig_5, sig_6]).set(queue=PRIORITY_QUEUE))
    

    本示例中的每个签名都是预先定义的,如果这些签名很复杂,这会产生很大的不同。 然后你可以调用create_workflow() 并在需要时应用delay()

    【讨论】:

      【解决方案2】:

      签名与链一起使用以创建工作流。 “.s”是“.signature”的缩写。当使用“.s”时,表示将前面任务的结果或返回值传递给下一个任务。 “签名”的反面是“不可变签名”,其中每个任务都是独立的。 例如(签名):

      res = chain(add.s(2,2), add.s(4), add.s(8))
      res().get()
      >> 16
      

      示例(不可变签名):

      res = chain(add.si(2,2)|add.si(4,4)|add.si(8,8))()
      res.get()
      >>16
      res.parent.get()
      >>8
      res.parent.parent.get()
      >>4
      

      【讨论】:

      • 注意:.si.signature(..., immutable=True) 的缩写。
      猜你喜欢
      • 2019-04-07
      • 2019-06-09
      • 1970-01-01
      • 1970-01-01
      • 2013-12-03
      • 2014-06-18
      • 2017-02-26
      • 2011-04-03
      • 2017-07-27
      相关资源
      最近更新 更多