Celery Redis Flower - NurOrNuLL/ESDP-AP-5-6-TEAM-2 GitHub Wiki
- Celery
Это распределенная асинхронная очередь заданий, которая обладает широким функционалом. В web приложениях нам часто приходиться запускать асинхронные с точки зрения ответа пользователю задачи.
- Redis
Брокер сообщений - это хранилище, которое взаимодействует как транспорт между производителем и потребителем. Бэкэнд результатов - это хранилище, в котором сохраняется информация о результатах и ошибках или задача Celery. Redis рекомендуется как брокер для celery.
- Flower
может позволить нам отслеживать Celery на удобной для пользовательского интерфейса веб-странице, потому что это может помочь нам лучше понять более подробную информацию о Celery, поэтому я решил поговорить об этом, прежде чем углубляться в дальнейшие исследования.
- Celery
pip install celery
ссылка на документацию - Redis
pip install redis
ссылка на документацию - Flower
pip install flower
ссылка на документацию
- В корневой папке настроек Django (например: она называется core) в вашем проекте создаете файл celery.py и туда записываете настройки описанные ниже
import os
from celery import Celery
# Set the default Django settings module for the 'celery' program.
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'core.settings')
app = Celery('core')
# Using a string here means the worker doesn't have to serialize
# the configuration object to child processes.
# - namespace='CELERY' means all celery-related configuration keys
# should have a `CELERY_` prefix.
app.config_from_object('django.conf:settings', namespace='CELERY')
# Load task modules from all registered Django apps.
app.autodiscover_tasks()
@app.task(bind=True)
def debug_task(self):
print(f'Request: {self.request!r}')
- В той же папке в файле init.py записываем следующие настройки :
# This will make sure the app is always imported when
# Django starts so that shared_task will use this app.
from .celery import app as celery_app
__all__ = ('celery_app',)
- В core/settings.py для того чтобы иметь возможность запускать проект можем записать дополнительные настройки для worker-a. Worker, это процесс celery который собственно получает задания из очереди и выполняет их.
REDIS_HOST = '0.0.0.0'
REDIS_PORT = '6379'
CELERY_BROKER_URL = 'redis://' + REDIS_HOST + ':' + REDIS_PORT + '/0'
CELERY_BROKER_TRANSPORT_OPTIONS = {'visibility_timeout': 3600}
CELERY_RESULT_BACKEND = 'redis://' + REDIS_HOST + ":" + REDIS_PORT + '/0'
CELERY_ACCEPT_CONTENT = ['application/json']
CELERY_TASK_SERIALIZER = 'json'
CELERY_RESULT_SERIALIZER = 'json'
- Например есть приложение в котором при обновлении страницы в папку cats загружаются фотографии котиков. В данном приложении создаем файл tasks.py и с celery импортирем task или через декоратор @app.task() закрепляем к выполняемой функции загрузки задачу
# Create your tasks here
import requests as r
import uuid
from celery import shared_task
from django.conf import settings
CAT_URL = 'https://thecatapi.com/api/images/get?format=src&type=gif'
from core.celery import app
@app.task()
def download_a_cat():
resp = r.get(CAT_URL)
file_ext = resp.headers.get('Content-Type').split('/')[1]
path = settings.BASE_DIR / 'cats' / (str(uuid.uuid4()) + "." + file_ext)
with open(path, 'wb') as f:
for chunk in resp.iter_content(chunk_size=128):
f.write(chunk)
return True
Далее в приложении в views.py импортирему задачи и закрепляем к view функцию задачи по методу delay()
from django.http import HttpResponse
# Create your views here.
from . import tasks
def home(request):
tasks.download_a_cat.delay()
return HttpResponse('<h1>I loading cats</h1>')
- запуск можно произвести в нескольких терминалах
Терминал 1
Запускаем проект как обычно python manage.py runserver
Терминал 2
Запускаем celery worker celery -A core worker -l info
Терминал 3
Запускаем celery flower celery -A core flower --adsress=127.0.0.6 --port=5556
Пример работы Celery Flower