15

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

文档中它说以下内容:

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

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

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

4

2 回答 2

17

签名与链一起使用以创建工作流。“.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
于 2018-06-29T06:31:08.137 回答
8

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

于 2018-03-26T11:31:05.803 回答