celery

Celery

(Distributed Task Queue)

Celery یک Distributed Task Queue ساده و انعطاف‌‌پذیر است که ارتباط بین Producer و Consumer را با استفاده از یک Message Broker مانند Redis و یا RabbitMQ ساده‌تر می‌کند.

فهرست عناوین:

Celery در برنامه‌های Django

طبق مستندات شروع به کار Celery در برنامه‌های Django اگر شما برنامه‌ای با ساختار زیر داشته باشید:

- proj/
  - manage.py
  - proj/
    - __init__.py
    - settings.py
    - urls.py

توصیه می‌شود در ابتدا یک ماژول جدید با نام celery.py در مسیر proj/proj ایجاد کنید:

# file: proj/proj/celery.py
import os
from celery import Celery
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'proj.settings')

app = Celery('proj')

app.config_from_object('django.conf:settings', namespace='CELERY')

app.autodiscover_tasks()

@app.task(bind=True)
def debug_task(self):
    print(f'Request: {self.request!r}')

حال برای اطمینان از import شدن ماژول celery.py در زمان اجرایshared_task توسط فریم‌ورک Django، ماژول __init__.py را در مسیر proj/proj ایجاد کرده و قطعه کد زیر را در این فایل قرار دهید:

from .celery import app as celery_app

__all__ = ('celery_app',)

در قدم بعد باید پیکربندی‌های مورد نیاز برای راه‌اندازی Celery را در انتهای فایل settings.py پروژه وارد کنید:

# Celery Configuration Options

BROKER_URL = 'redis://:a*********3t@tommy.iran.liara.ir:34470/0'
CELERY_RESULT_BACKEND = 'redis://:a*********3t@tommy.iran.liara.ir:34470/0'
CELERY_ACCEPT_CONTENT = ['application/json']
CELERY_TASK_SERIALIZER = 'json'
CELERY_RESULT_SERIALIZER = 'json'
CELERY_TIMEZONE = 'Asia/Tehran'

با قرار داشتن قطعه کد app.autodiscover_tasks() در فایل proj/proj/celery.py این امکان برای شما فراهم است که taskهای مورد نظر خود را در فایل tasks.py هر App به‌صورت جداگانه تعریف کنید:

- app1/
    - tasks.py
    - models.py
- app2/
    - tasks.py
    - models.py

برای مثال می‌توانید با استفاده از دکوریتور @shared_task به‌شکل زیر taskهای خود را تعریف کنید:

# app1/tasks.py

from celery import shared_task

@shared_task
def add(x, y):
    return x + y

درنهایت قبل از استقرار این پروژه در لیارا نیاز است که فایل supervisor.conf را در مسیر اصلی پروژه ایجاد کرده و پیکربندی زیر را در این فایل قرار دهید:

[program:celery-worker]
process_name=%(program_name)s_%(process_num)02d
command=celery -A proj worker -l INFO
autostart=true
autorestart=true
stopasgroup=true
killasgroup=true
numprocs=1
startsecs=10
stopwaitsecs=600
redirect_stderr=true
stdout_logfile=/tmp/worker.log
;