Celery یک سیستم صف وظیفه برای اجرای عملیات سنگین در پس‌زمینه است و در جنگو زمانی استفاده می‌شود که نمی‌خواهیم درخواست HTTP معطل کارهای زمان‌بر بماند. با کمک یک پیام‌رسان مثل Redis، وظایف به صف فرستاده می‌شوند و Workerها آنها را غیرهمزمان اجرا می‌کنند. این موضوع باعث افزایش سرعت پاسخ‌گویی، مدیریت بهتر منابع و امکان زمان‌بندی کارهای تکرارشونده می‌شود.


 

مقدمه

در معماری برنامه‌های وب مدرن، اجرای وظایف زمان‌بر (Time-Consuming Tasks) در فرآیند پاسخ‌دهی HTTP باعث کاهش شدید عملکرد و تجربه کاربری می‌شود. عملیات‌هایی مانند ارسال ایمیل، پردازش فایل‌های حجیم، تولید گزارش، یا فراخوانی APIهای خارجی جزو این دسته هستند.
در چارچوب Django راه‌حل استاندارد برای این مسئله، استفاده از Celery است؛ یک سیستم مدیریت صف مبتنی بر پیام‌رسان‌ها که امکان اجرای وظایف را در پس‌زمینه، به‌صورت غیرهمزمان و توزیع‌شده فراهم می‌کند.


Celery چیست؟

Celery یک ابزار Distributed Task Queue است که وظایف (Tasks) را به کمک یک Message Broker مانند RabbitMQ یا Redis مدیریت و برنامه‌ریزی می‌کند. Celery دارای سه مؤلفه اصلی است:

  1. Task Producer (Django App)
    جایی که وظیفه تعریف و به صف ارسال می‌شود.

  2. Broker (Redis, RabbitMQ)
    مسئول انتقال پیام بین تولیدکننده و Worker است.

  3. Worker
    پردازش وظایف ارسال‌شده به صف را انجام می‌دهد.


مزایای استفاده از Celery

  • اجرای غیرهمزمان وظایف

  • بالابردن سرعت پاسخ‌دهی درخواست‌ها

  • قابلیت توزیع در چند سرور

  • امکان زمان‌بندی وظایف (Celery Beat)

  • پشتیبانی از retry، monitoring و result backend


نحوه راه‌اندازی Celery در Django

در این بخش یک مثال کامل ارائه می‌شود که شامل تعریف پروژه، پیکربندی Celery و اجرای یک Task نمونه مانند ارسال ایمیل است.

۱. نصب Celery و Redis

برای سادگی، Redis را به عنوان Message Broker انتخاب می‌کنیم.

 
pip install celery redis

اجرای Redis (در لینوکس یا مک):

 
redis-server

۲. ساختار پروژه Django

فرض کنید پروژه‌ای با نام myproject و اپلیکیشنی با نام core داریم:

 
myproject/ myproject/ __init__.py settings.py urls.py celery.py core/ tasks.py views.py manage.py

۳. پیکربندی Celery — ساخت فایل celery.py

در مسیر myproject/myproject/celery.py فایل زیر را ایجاد کنید:

 
from __future__ import absolute_import, unicode_literals import os from celery import Celery os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'myproject.settings') app = Celery('myproject') app.config_from_object('django.conf:settings', namespace='CELERY') app.autodiscover_tasks()

در فایل __init__.py همین فولدر، Celery را لود کنید:

 
from .celery import app as celery_app __all__ = ('celery_app',)

۴. افزودن تنظیمات مورد نیاز در settings.py

 
CELERY_BROKER_URL = "redis://localhost:6379/0" CELERY_RESULT_BACKEND = "redis://localhost:6379/0" CELERY_ACCEPT_CONTENT = ['json'] CELERY_TASK_SERIALIZER = 'json' CELERY_RESULT_SERIALIZER = 'json'

۵. تعریف یک Task نمونه

در فایل core/tasks.py:

 
from celery import shared_task from time import sleep @shared_task def send_welcome_email(user_email): # شبیه‌سازی عملیات زمان‌بر sleep(5) return f"Email sent to {user_email}"

۶. فراخوانی Task در View

در core/views.py:

 
from django.http import HttpResponse from .tasks import send_welcome_email def register(request): send_welcome_email.delay("user@example.com") return HttpResponse("User registered. Email will be sent asynchronously.")

فراخوانی .delay باعث می‌شود وظیفه به صف ارسال شود و بلاک نشود.


۷. اجرای Worker

در ترمینال:

 
celery -A myproject worker -l info

۸. استفاده از Celery Beat برای زمان‌بندی وظایف

نصب:

 
pip install celery[redis]

در settings.py:

 
from celery.schedules import crontab CELERY_BEAT_SCHEDULE = { 'run-every-1-minute': { 'task': 'core.tasks.sample_task', 'schedule': crontab(minute='*/1'), }, }

در tasks.py:

 
@shared_task def sample_task(): print("Periodic task executed")

اجرای Beat:

 
celery -A myproject beat -l info

نتیجه‌گیری

 

Celery یکی از مهم‌ترین ابزارها برای توسعه وب اپلیکیشن‌های مقیاس‌پذیر در جنگو است. استفاده از مدل صف‌محور آن باعث مدیریت بهتر عملیات سنگین، بهبود پاسخ‌دهی و افزایش قابلیت توسعه می‌شود. ویژگی‌هایی مانند اجرای غیرهمزمان وظایف، زمان‌بندی دقیق و قابلیت توزیع در چند سرور، Celery را به انتخاب اصلی برای مدیریت Taskها در پروژه‌های متوسط تا بزرگ Django تبدیل کرده است.

برچسب‌ها

برای ارسال نظر لطفا وارد شوید.