Why do we need Signatures in Celery?
Asked Answered
E

2

28

I've started using Celery 4.1 in my Django Python project and have come across Signatures.

In the documentation it says the following:

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.

Although I see them used in some of the examples I don't really know when and why to use them, as well as which problems they solve. Can someone explain this to a layman?

Enthuse answered 4/1, 2018 at 15:49 Comment(0)
I
33

Signature used together with chain to create a workflow. ".s" is the abbreviation of ".signature". when use ".s", means that the result or return value of the front task will be pass to the next one. The opposite of 'signature' is 'immutable signature', in which every task is independent. for example(signature):

res = chain(add.s(2,2), add.s(4), add.s(8))
res().get()
>> 16

example(immutable signature):

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
Imre answered 29/6, 2018 at 6:31 Comment(1)
Note: .si is short for .signature(..., immutable=True).Umbles
C
11

You can think of signatures in Celery as placeholders for running tasks. For example, let's say you wish to construct a complex workflow consisting of chords, groups and chains, and use it in a different piece of code. In this case, it would be easier to define various task signatures and place them in your workflow as neccessary:

def create_workflow():
    return chord([sig_1, sig_2, chain([sig_3, sig_4])], 
        body=group([sig_5, sig_6]).set(queue=PRIORITY_QUEUE))

Where each signature in this example has been pre-defined, which can ,make a lot of difference should those signatures be complicated. Then you can call create_workflow() and apply delay() to it whenever needed

Contractor answered 26/3, 2018 at 11:31 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.