ویژگی تصویر

مدیریت صف وظایف در پایتون با Celery

  /  پایتون   /  مدیریت صف وظایف در پایتون با 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 با سایر فریمورک‌ها

ویژگیCeleryRQ (Redis Queue)APScheduler
پشتیبانی از بروکرهاRedis, RabbitMQ, و غیرهفقط Redisفقط در حافظه
پشتیبانی از دوره‌ایبلهخیربله
قابلیت توسعهبسیار خوبمتوسطمتوسط

نکات مهم در استفاده از Celery

  • وظایف باید قابل ترتیب و دارای ورودی‌های ساده باشند.
  • برای پشتیبانی از وظایف دوره‌ای، از Celery Beat استفاده کنید.
  • در محیط تولید، استفاده از Celery Worker و Broker جداگانه توصیه می‌شود.

جمع‌بندی

Celery یک ابزار قدرتمند برای مدیریت وظایف غیرهمگام در پایتون است. با استفاده از Celery، می‌توانید برنامه‌های وب کارآمدتری بسازید. تنظیمات بهینه و دقت در نوشتن وظایف، نقش مهمی در عملکرد نهایی دارد.

آیا این مطلب برای شما مفید بود ؟

خیر
بله
موضوعات شما در انجمن: