Performance: When signals are appropriate vs not
MEDIUM IMPACT
Signals affect server-side processing speed and database transaction time, impacting response time and user experience.
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 |