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

Why do we need Signatures in Celery?

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

documentation 中,它表示如下:

You just learned how to call a task using the tasks delay method in the calling guide, and this is often all you need, but sometimes you may want to pass the signature of a task invocation to another process or as an argument to another function.

A signature() wraps the arguments, keyword arguments, and execution options of a single task invocation in a way such that it can be passed to functions or even serialized and sent across the wire.

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

您可以将 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))

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

签名与链一起用于创建工作流。 “.s”是“.signature”的缩写。当使用“.s”时,意味着前面任务的结果或return值将传递给下一个任务。 'signature'的对立面是'immutable signature',其中每个任务都是独立的。 例如(签名):

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