بدءًا من Django 6، صار فيه حل مدمج بالإطار نفسه لتشغيل مهام خارج دورة الطلب/الاستجابة — بلا حاجة لتثبيت أي مكتبة خارجية. لسنين طويلة، Celery كان الخيار شبه الوحيد لهذا الغرض بمشاريع Django. فهل صار Celery غير ضروري؟ لنقارن.
Django Tasks — مدمج وبسيط
سطر واحد يحوّل دالة عادية لمهمة قابلة للجدولة:
from django.tasks import task
@task
def send_welcome_email(user_email):
# ... إرسال البريد ...
pass
# من أي مكان بالكود:
send_welcome_email.enqueue(user_email=user.email)
بلا broker خارجي، بلا مكتبة إضافية — الإعداد الافتراضي (ImmediateBackend)
يشتغل فورًا من أول تجربة محلية. لكن هذا بالضبط قيده الأكبر: ImmediateBackend
تُنفّذ المهمة بشكل متزامن ضمن نفس الطلب، مناسبة للتطوير فقط — الإنتاج
الحقيقي يحتاج خلفية طرف ثالث توفّر عمّالًا (workers) مستقلّين فعليًا.
Celery — الخيار الناضج تقليديًا
# tasks.py
from celery import shared_task
@shared_task
def send_welcome_email(user_email):
# ... إرسال البريد ...
pass
# من أي مكان بالكود:
send_welcome_email.delay(user_email=user.email)
يحتاج broker منفصل (Redis أو RabbitMQ) لتمرير المهام لعمّال
مستقلّين، وعملية worker تشتغل بشكل منفصل عن خادم الويب. مقابل هذا
التعقيد الإضافي، تحصل على نظام ناضج ومُختبَر على نطاق واسع، مع
Celery Beat لجدولة مهام دورية (cron)، وأداة Flower لمراقبة
الطابور مباشرة.
جدول المقارنة
| المعيار | Django Tasks (مدمج) | Celery |
|---|---|---|
| التثبيت | مدمج، بلا حزمة إضافية للتعريف الأساسي | مكتبة منفصلة + broker خارجي (Redis/RabbitMQ) |
| مهام مجدولة دوريًا | غير مدعومة بالإطار الأساسي حاليًا | مدعومة رسميًا عبر Celery Beat |
| خلفية إنتاج حقيقية | تحتاج حزمة طرف ثالث توفّر عمّالًا | ناضجة ومختبرة على نطاق واسع فعليًا |
| مراقبة الطابور | غير مدمجة | متوفّرة عبر Flower وأدوات مشابهة |
| منحنى التعلّم | بسيط جدًا، سطر @task وenqueue() | يحتاج فهم broker + worker + إعدادات |
متى تختار كل واحد؟
القاعدة العملية: مشروع جديد بمهام بسيطة غير مجدولة (بريد ترحيب، إشعار)؟ ابدأ بـ Django Tasks المدمج وقلّل التبعيات. مشروع يحتاج جدولة دورية أو حمل عمل ثقيل موزّع، أو already يشتغل على Celery وتمام؟ ما فيه داعي تهاجر — Celery ما زال الخيار الأنضج لهذه الحالات.
- ابدأ بـ Django Tasks إن كان مشروعك صغيرًا أو متوسطًا، والمهام بسيطة وغير مجدولة دوريًا، وتبي أقل تبعيات ممكنة.
- استخدم Celery إن احتجت مهامًا مجدولة (cron)، أو حمل عمل ثقيل على عدّة عمّال، أو مراقبة جاهزة للطابور، أو كان مشروعك already مبنيًا عليه.
الخلاصة
Django Tasks Framework مش بديل كامل لـ Celery حتى الآن — هو حل مدمج للحالات البسيطة يقلّل التبعيات بمشاريع جديدة، بينما Celery يبقى الخيار الأنضج للمهام المجدولة دوريًا وحمل العمل الثقيل بالإنتاج. الاثنان يخدمان نفس الهدف العام (تحرير الطلب من الانتظار)، لكن بمستوى نضج ونطاق مختلف تمامًا.
ابدأ مسار Django الكامل بالعربي — من أول نموذج لحد المهام الخلفية والنشر الحقيقي.