为什么我们需要Celery中的签名?

时间:2018-01-04 15:49:35

标签: python django celery signatures

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

documentation中,它说明了以下内容:

  

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

     

signature()以一种方式包装单个任务调用的参数,关键字参数和执行选项,以便它可以传递给函数,甚至可以序列化并通过线路发送。

虽然我在一些例子中看到了它们,但我并不知道何时以及为何使用它们,以及它们解决了哪些问题。 有人可以向外行解释这个吗?

2 个答案:

答案 0 :(得分:4)

签名与链一起使用以创建工作流。 “ .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

答案 1 :(得分:3)

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

Dim PRTSLastRow As Long
Dim PRTSLastCol As Long
Dim ColLtr As String
Dim LastColLtr As String
Dim Total As String
Dim j as Integer

W = ActiveWorkbook.Name
PRTSLastCol = Worksheets("PRTSCarrierCount").Cells(1, Columns.Count).End(xlToLeft).Column
PRTSLastRow = Worksheets("PRTSCarrierCount").Cells(Rows.Count, 1).End(xlUp).Row
j = 1
Workbooks(W).Sheets("PRTSCarrierCount").Activate

For i = 1 To PRTSLastCol
    Total = Cells(1, i).Value
    If InStr(1, CStr(Total), "Total") > 0 Then
        ColLtr = Replace(Cells(1, i).Address(True, False), "$1", "")
        LastColLtr = Replace(Cells(1, PRTSLastCol + j).Address(True, False), "$1", "")
        Range("ColLtr & 1: & ColLtr & PRTSLastRow").Select
        'Columns("ColLtr & : & ColLtr").Select
        Selection.Copy
        Range("LastColLtr & 1").Select
        ActiveSheet.Paste
        j = j + 1
    End If
Next i

此示例中的每个签名都已预先定义,如果这些签名很复杂,可能会产生很大的不同。 然后,您可以致电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()应用于其中