Why use signals in Django?
The Django Signals is a strategy to allow decoupled applications to get notified when certain events occur. Let’s say you want to invalidate a cached page everytime a given model instance is updated, but there are several places in your code base that this model can be updated. You can do that using signals, hooking some pieces of code to be executed everytime this specific model’s save method is trigged.
Another common use case is when you have extended the Custom Django User by using the Profile strategy through a one-to-one relationship. What we usually do is use a “signal dispatcher” to listen for the User’s post_save event to also update the Profile instance as well.
I have read lots of documentation and articles about using signals in Django, but I cannot understand the concept.  

What is the purpose of using signals in Django?
How does it work?

Please explain the concept of signals and how to use it in Django code.