我已经开始在我的Django Python项目中使用Celery 4.1,并遇到了签名。
在文档中,它说以下内容:
您刚刚学习了如何使用调用指南中的 tasks delay 方法调用任务,这通常是您所需要的,但有时您可能希望将任务调用的签名传递给另一个进程或作为参数传递给另一个函数。
signature(( 包装单个任务调用的参数、关键字参数和执行选项,使其可以传递给函数,甚至可以序列化并通过网络发送。
虽然我看到它们在一些例子中使用,但我真的不知道何时以及为什么使用它们,以及它们解决了哪些问题。有人可以向外行解释一下吗?
与链一起使用以创建工作流的签名。 ".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
您可以将 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()