Performance: When signals are appropriate vs not
Signals affect server-side processing speed and database transaction time, impacting response time and user experience.
Jump into concepts and practice - no test required
from django.db.models.signals import post_save from django.dispatch import receiver from myapp.tasks import do_heavy_task_async @receiver(post_save, sender=MyModel) def trigger_async_task(sender, instance, **kwargs): do_heavy_task_async.delay(instance.id)
from django.db.models.signals import post_save from django.dispatch import receiver import time @receiver(post_save, sender=MyModel) def do_heavy_task(sender, instance, **kwargs): # heavy processing or external API call time.sleep(5) instance.related_model.update_status('done')
| Pattern | Database Operations | Blocking Time | Side Effects | Verdict |
|---|---|---|---|---|
| Heavy synchronous signal | Multiple writes and queries | Blocks request for seconds | Hidden and hard to debug | [X] Bad |
| Async task triggered by signal | Minimal immediate DB ops | Non-blocking request | Clear separation of concerns | [OK] Good |
| Signal for simple update | Extra DB writes | Adds latency | Implicit side effects | [!] OK |
| Explicit update in view/function | Single DB transaction | Fast response | Clear and predictable | [OK] Good |
Book instance is saved?from django.db.models.signals import post_save
from django.dispatch import receiver
@receiver(post_save, sender=Book)
def notify_author(sender, instance, created, **kwargs):
if created:
print(f"Notify {instance.author} about new book")
book = Book(title='Django Tips', author='Alice')
book.save()from django.db.models.signals import post_save
post_save.connect(handle_save)
def handle_save(sender, instance, **kwargs):
print('Saved!')