Навигация
|
Асинхронные задачи в Python + Celery + RabbitMQ + Redis
Репозитория: https://github.com/vjanz/python-asynchronous-tasks
Celery - очередь задач, ориентированная на обработку в реальном времени и поддерживающая планирование задач RabbitMQ - брокер сообщений, обрабатывает очередь "сообщений" между Django и Celery Redis - хранилище на основе ключей и значений с быстрым доступом, используется для обработки результатов В этой статье мы собираемся использовать Celery, RabbitMQ и Redis для создания распределенной очереди задач Распределенная очередь задач позволяет вам переложить работу на другой процесс, чтобы она выполнялась асинхронно Как только вы помещаете работу в очередь, то не ждете и параллельно используете другие ядра для обработки задач Таким образом, это дает возможность выполнять задачи в фоновом режиме, когда приложение решает другие задачи
Самый простой пример - отправка электронных писем после регистрации пользователя В этом случае вы не знаете, сколько времени потребуется, чтобы отправить электронное письмо пользователю Это может быть 1 мс, но может быть и больше, а иногда даже не будет отправлено вообще В этих сценариях вы не знаете, что задача будет успешно выполнена, потому что это сделает провайдер
Сторонние задачи Веб-приложение должно обслуживать пользователей, не дожидаясь завершения других действий при загрузке страницы Например отправки электронного письма или каких-то уведомлений Длительные задания Задания, требующие значительных ресурсов, когда пользователи ждут, пока они вычислят свои результаты Например, выполнение сложного рабочего процесса, генерация графа, обработка видео Периодические задачи Задания, которые планируется запускать в определенное время или через определенный интервал Например, создание ежемесячного отчета или веб-парсер, который запускается два раза в день
Celery требует транспорта для отправки и получения сообщений Некоторые кандидаты в качестве брокера сообщений: Мы будем использовать RabbitMQ в качестве брокера Предпочтительно использовать RabbitMQ, т.к. Celery изначально поддерживает его и просто работает Когда задачи отправляются брокеру, а затем выполняются celery worker, мы хотим: Для этого вам понадобится какое-то хранилище данных, и для этого мы будем использовать Redis Для хранилищ результата так-же существует много кандидатов: Для настройки этих сервисов мы будем использовать Docker:
Создадим новый каталог и необходимые для проекта файлы: Создать и активировать виртуальную среду: Теперь установим зависимости проекта из requirements.txt: amqp==5.0.6 Для данного проекта нам понадобятся Celery и Redis: Настроим docker-compose для запуска RabbitMQ и Redis В файле docker-compose.yaml вставьте следующую конфигурацию YAML: Здесь мы запускаем две службы: Чтобы узнать, переменные среды для вашего образа - перейдите к документации образа в dockerhub Инициализируем приложение celery для использования: В tasks.py вставим следующий код: Мы определили URL-адреса для RabbitMQ и Redis Затем инициализируем приложение celery, используя эти конфигурации Первым параметром задачи является имя текущего модуля Функция say_hello с атрибутом @app.task (помечена как задача, может вызваться с помощью .delay())
Запускаем службы (RabbitMQ и Redis) с помощью докера: Убедиться, что контейнеры запущены и работают: Должны увидеть две запущенные службы и дополнительную информацию для каждой из них Запустим celery worker, затем попробуем запустить некоторые задачи с интерактивной оболочкой python Запуск воркера Celery Теперь запустим задачу из интерактивной оболочки: Мы вызвали функцию say_hello, используя .delay(), затем передали аргумент Test_Arg_Name_1 Затем мы получаем AsyncResult, который является задачей, которая была передана брокеру После этого данная задача будет обработана и завершена Celery в фоновом режиме В логах воркера получена задача Через 5 секунд (sleep(5)) сообщит, что задача успешно завершена Повторим запуск задачи, но теперь добавим хранилище результатов Redis В оболочке python давайте сохраним результат в переменной, а затем запустим ее свойства $ python PENDING и SUCCESS - состояния, которые мы успеваем увидеть т..к сделали исскуственную задержку sleep(5) Если б не был настроен бэкэнд Redis на Celery, мы не могли получить доступ к свойствам или функциям По умолчанию не хранятся состояния, но поскольку Redis есть, мы можем получать информацию о задачах
Комментарии пользователей Эту новость ещё не комментировалиНаписать комментарий Анонимам нельзя оставоять комментарии, зарегистрируйтесь! |
Контакты Группа ВК | Код обмена баннерами | Видео к IT статьям на YoutubeВидео на другие темы Смотреть | |||
Мои друзья: | © Snakeproject.ru создан в 2013 году.При копировании материала с сайта - оставьте ссылку.Весь материал на сайте носит ознакомительный характер,за его использование другими людьми, автор ответственности не несет. |
||||
Поддержать автора и проект
|