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?
What are Celery Signatures ? Signatures are used when you want to send the signature of a task invocation to another process or as an argument to another function. A signature() wraps the args, kwargs, and execution options of a single task invocation.
The "shared_task" decorator allows creation of Celery tasks for reusable apps as it doesn't need the instance of the Celery app. It is also easier way to define a task as you don't need to import the Celery app instance.
Celery is an open-source Python library which is used to run the tasks asynchronously. It is a task queue that holds the tasks and distributes them to the workers in a proper manner. It is primarily focused on real-time operation but also supports scheduling (run regular interval tasks).
Celery chords are one of the six Celery workflow primitives. A Celery workflow defines the order in which individual Celery tasks are executed asynchronously. A chord consists of a Celery group (called chord header) and a callback. A group is a list of tasks that are executed in parallel.
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
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
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With