Продвинутый Django 5 для продолжающих

Прогресс по курсу:  0/193

9.3 Асинхронная отправка электронных писем
2 из 2 шагов пройдено

Чтобы сделать выполнение данной задачи в фоне, и не выполнять определенные задачи внутри запроса, вот где проявляется необходимость в Celery. Во первых, его необходимо установить:

pip install Celery


Теперь нам нужно создать Celery приложение  в нашем Django приложении publish/celery.py:

import os
from celery import Celery

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'django_celery.settings')
app = Celery('publish', broker_connection_retry=False,
             broker_connection_retry_on_startup=True, )
app.config_from_object('django.conf:settings')
broker_connection_retry = False

app.autodiscover_tasks()


Celery - это очередь задач. Он получает задания из нашего приложения Django и запускает их в фоновом режиме. Celery должен быть сопряжен с другими сервисами, которые действуют в качестве брокеров. 

 

Обработчики и Брокеры (Workers & Brokers)

Для начала, нужно объяснить некоторые основные понятия, которые используются в Celery

Итак, Celery — это программа, которая отслеживает задачи (tasks), которые необходимо выполнить, и в которой есть набор обработчиков (workers), которые будут выполнять эти задачи. Основной смысл в том, что она (программа) может выполнять несколько задач параллельно и что она не блокирует поставщиков (producers) этих самых задач.

Celery на самом деле не хранит все эти задачи в памяти. Для хранения задач есть отдельный сервис, называемый брокером сообщений (message broker), который по сути своей является очередью. Обычно это либо Redis, либо RabbitMQ. Т.е. Celery следит за тем, что происходит в очереди, но хранится она внутри Redis/RabbitMQ.

При запуске Celery создается 1 обработчик.

celery -A publish worker


Этот обработчик является главным процессом (supervisor process), который будет порождать дочерние процессы или потоки, которые в свою очередь будут выполнять задачи.

По-умолчанию главный обработчик будет создавать дочерние процессы, а не потоки, и он создаст столько одновременных дочерних процессов, сколько ядер у процессора.

Главный процесс будет следить за тем, что происходит с задачами и процессами/потоками, но он не будет запускать сами задачи.

Эта группа дочерних процессов или потоков, которая ожидает выполнения задач, называется пулом выполнения (execution pool) или пулом потоков (thread pool).

Брокеры промежуточно отправляют сообщения между веб-приложением и Celery. В этом уроке мы будем использовать Redis. Redis прост в установке, и мы можем легко начать с него без особых проблем.

Вы можете установить Redis, следуя инструкциям на странице Redis Quick Start.

Вам нужно будет установить библиотеку Redis Python, выполнив:

pip install redis


И комплект, необходимый для использования Redis и Celery: 

pip install -U "celery[redis]"


Запустите Redis сервер в отдельной консоли следующим образом: redis-server


Давайте добавим связанные с Celery/Redis конфиги в django_celery/settings.py:

REDIS_HOST = 'localhost'
REDIS_PORT = '6379'
BROKER_URL = 'redis://' + REDIS_HOST + ':' + REDIS_PORT + '/0'
BROKER_TRANSPORT_OPTIONS = {'visibility_timeout': 3600}
CELERY_RESULT_BACKEND = 'redis://' + REDIS_HOST + ':' + REDIS_PORT + '/0'

 

Очереди (Queues)

Да, тут намеренно используется множественное число для очередей, потому что существует несколько видов очередей.

Прежде всего, существует главная очередь (main queue), которая принимает задачи от поставщиков (producers) по мере их поступления и передает обработчикам по мере их запроса. По умолчанию есть только одна такая очередь. Все обработчики принимают задачи из одной очереди. Но вы также можете указать несколько таких очередей и назначить конкретные обработчики на определенные очереди. Очередь по умолчанию называется celery.


Чтобы просмотреть первые 100 задач в очереди в Redis, выполните:

redis-cli lrange celery 0 100


Эти очереди сильно напоминают FIFO (First In First Out), но это не совсем так.
Задачи, которые сначала помещаются в очередь, первыми удаляются из очереди, но они не обязательно выполняются первыми.


  • Комментария
Будьте вежливы и соблюдайте наши принципы сообщества. Пожалуйста, не оставляйте решения и подсказки в комментариях, для этого есть отдельный форум.
Оставить комментарий

А зачем знак доллара перед Redis-server?

@Ilia_Boiarintsev, исправил, опечатка была, видимо прилетела из консоли при копировании.

Привет! Подскажите, почему могу получать такую ошибку?

@Alex, У нас была ошибка в тексте команды, на скриншоте была правильная команда. Введите:

celery -A publish worker