为什么在Celery中需要签名?

25

我在我的Django Python项目中开始使用Celery 4.1,并遇到了“Signatures”。

文档中,它说:

在调用指南中,你学会了如何使用任务的delay方法来调用任务,这通常就足够了,但有时你可能想将任务调用的签名传递给另一个进程或作为参数传递给另一个函数。

签名()以一种方式包装单个任务调用的参数、关键字参数和执行选项,使得它可以传递给函数甚至被序列化并发送到网络上。

虽然我看到它们在一些示例中被使用,但我真的不知道什么时候和为什么要使用它们,以及它们解决了哪些问题。 有人能向小白解释一下吗?

2个回答

30

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

7
注意:".si" 是 ".signature(..., immutable=True)" 的简写。 - luckydonald

11

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接