
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