مدیریت صف وظایف در پایتون با Celery
در دنیای برنامهنویسی، خصوصاً در توسعه وب، مدیریت وظایف غیرهمگام (Asynchronous Task Management) یکی از موضوعات کلیدی است. Celery، یک فریمورک قدرتمند برای انجام وظایف غیرهمگام در پایتون است. این مقاله به توضیح نحوه استفاده از Celery در مدیریت صف وظایف و بهبود عملکرد برنامههای وب میپردازد.
چرا از Celery استفاده کنیم؟
Celery برای انجام وظایف غیرهمگام در پایتون طراحی شده است. به عبارت دیگر، وظایفی که زمانبر هستند مانند ارسال ایمیل، پردازش تصویر، یا فرآیندهای پایگاه داده را میتوان به صورت پسزمینه اجرا کرد. این کار باعث بهبود تجربه کاربری و سرعت پاسخدهی برنامه میشود.
نحوه کار Celery
Celery یک ساختار ساده از سه بخش اصلی دارد:
- Broker: سروری که وظایف را ذخیره میکند (مانند Redis یا RabbitMQ).
- Worker: فرآیندی که وظایف را از صف میگیرد و اجرا میکند.
- Task: تابعی که باید به صورت غیرهمگام اجرا شود.
نصب و راهاندازی Celery
برای شروع کار با Celery، ابتدا آن را نصب کنید:
pip install celery
سپس یک پروژه ساده با ساختار زیر ایجاد کنید:
- app.py: فایل اصلی برای تعریف Celery.
- tasks.py: وظایفی که باید به صورت غیرهمگام اجرا شوند.
مثال ساده از Celery
در اینجا یک مثال ساده از تعریف وظیفه در Celery آمده است:
# app.py
from celery import Celery
app = Celery('myapp', broker='redis://localhost:6379/0')
@app.task
def add(x, y):
return x + y
در این کد، یک Celery با نام myapp ایجاد شده است. وظیفه add به صورت غیرهمگام اجرا خواهد شد.
اجرای وظیفه
برای اجرای وظیفه، میتوانید از دستور زیر استفاده کنید:
# tasks.py
from app import app
result = app.send_task('add', args=[2, 3])
print(result.get()) # خروجی: 5
این کد یک وظیفه اضافه را به صف میفرستد و نتیجه آن را چاپ میکند.
ساختار بهتر برای مدیریت وظایف
برای ساختار مناسب، میتوانید از پوشههای جداگانه استفاده کنید:
.
├── app.py
├── tasks/
│ ├── __init__.py
│ └── math_tasks.py
در فایل math_tasks.py:
# tasks/math_tasks.py
from app import app
@app.task
def multiply(x, y):
return x * y
پیکربندی Celery بهتر
برای استفاده مؤثرتر، میتوانید از فایل پیکربندی استفاده کنید:
# celery_config.py
broker_url = 'redis://localhost:6379/0'
result_backend = 'redis://localhost:6379/0'
task_serializer = 'json'
accept_content = ['json']
result_serializer = 'json'
timezone = 'UTC'
enable_utc = True
سپس در app.py:
# app.py
from celery import Celery
import celery_config
app = Celery()
app.config_from_object(celery_config)
مدیریت وظایف با استفاده از Celery Beat
Celery Beat به شما اجازه میدهد وظایف را به صورت دورهای اجرا کنید. برای فعال کردن آن:
celery -A app.celery beat --loglevel=info
برای تعریف وظیفه دورهای:
# app.py
from celery import Celery
from celery.schedules import crontab
app = Celery('myapp', broker='redis://localhost:6379/0')
app.conf.beat_schedule = {
'add-every-30-seconds': {
'task': 'tasks.add',
'schedule': 30.0,
'args': (16, 16)
},
}
بررسی عملکرد و خطاهای رایج
برای مدیریت خطاهای وظایف، میتوانید از retry استفاده کنید:
# tasks.py
from app import app
@app.task(bind=True, autoretry_for=(Exception,), retry_kwargs={'max_retries': 3})
def unreliable_task(self, x):
try:
return x / 0 # خطا ایجاد میکند
except ZeroDivisionError as exc:
raise self.retry(exc=exc)
در این کد، اگر وظیفه با خطا مواجه شود، دوباره تلاش میکند.
بهینهسازی و عملکرد
برای بهینهسازی Celery، باید:
- تعداد Workerها را براساس منابع سرور تنظیم کنید.
- استفاده از Redis به جای RabbitMQ در موارد ساده.
- استفاده از
acks_late=Trueبرای اطمینان از اجرای صحیح وظایف.
مقایسه Celery با سایر فریمورکها
| ویژگی | Celery | RQ (Redis Queue) | APScheduler |
|---|---|---|---|
| پشتیبانی از بروکرها | Redis, RabbitMQ, و غیره | فقط Redis | فقط در حافظه |
| پشتیبانی از دورهای | بله | خیر | بله |
| قابلیت توسعه | بسیار خوب | متوسط | متوسط |
نکات مهم در استفاده از Celery
- وظایف باید قابل ترتیب و دارای ورودیهای ساده باشند.
- برای پشتیبانی از وظایف دورهای، از Celery Beat استفاده کنید.
- در محیط تولید، استفاده از Celery Worker و Broker جداگانه توصیه میشود.
جمعبندی
Celery یک ابزار قدرتمند برای مدیریت وظایف غیرهمگام در پایتون است. با استفاده از Celery، میتوانید برنامههای وب کارآمدتری بسازید. تنظیمات بهینه و دقت در نوشتن وظایف، نقش مهمی در عملکرد نهایی دارد.
آیا این مطلب برای شما مفید بود ؟




