Введение
При разработке бэкенда на Python, мы часто сталкиваются с задачами, которые требуют выполнения в фоновом режиме. Это могут быть длительные операции, такие как обработка изображений или отправка email-уведомлений, которые не должны блокировать работу основного приложения.
Для решения подобных задач часто используется Celery - популярная библиотека для создания и управления очередями задач. Celery позволяет создавать задачи, которые выполняются в фоновом режиме, а также управлять очередью задач и их выполнением.
В этой статье мы рассмотрим возможности Celery для разработки бэкенд-приложений на языке Python. Мы начнем с установки и настройки Celery, затем рассмотрим создание задач, работу с результатами задач, расписание и повторение задач, а также масштабирование Celery для работы в многопроцессорных системах и кластерах.
Настройка
Прежде чем начать использовать Celery, необходимо установить библиотеку и настроить ее для работы в вашем приложении. Для начала необходимо установить пакет:
pip install celery
Также понадобятся брокер сообщений и бэкенд для хранения результатов задач. Для примера используем Redis, запущенный на localhost. Включим в проект конфигурационный файл celeryconfig.py со следующими настройками:
# Брокер и бэкенд
BROKER_URL = 'redis://'
CELERY_RESULT_BACKEND = BROKER_URL
# json-сериализация задач при передаче
CELERY_TASK_SERIALIZER = 'json'
CELERY_ACCEPT_CONTENT = ['json']
CELERY_RESULT_SERIALIZER = 'json'
При использовании Django можно поместить данные настройки непосредственно в модуль settings.py
Для запуска celery нужно выполнить команду
celery -A your_project_name worker -l info
Создание задач
Допустим у нас есть функция, которую мы хотим исполнять в celery. Для примера возьмем простую a+b:
def add_numbers(x, y):
return x + y
Чтобы создать задачу на основе этой функции, мы можем использовать декоратор @task
:
from celery import Celery
app = Celery('tasks')
app.config_from_object('celeryconfig', force=True)
@app.task
def add_numbers(x, y):
return x + y
В этом примере мы создали объект app
типа Celery
и использовали декоратор @task
для создания задачи на основе функции add_numbers
. Для запуска можно использовать метод delay()
или apply_async()
:
result = add_numbers.delay(2, 3)
Метод delay()
возвращает объект AsyncResult
, который можно использовать для проверки статуса выполнения задачи и получения ее результата.
Проверка статуса и получение результата задачи
result = add_numbers.delay(2, 3)
print(result.status) # 'PENDING'
print(result.result) # None
print(result.get()) # 5
В этом примере мы запустили задачу add_numbers
, проверили статус ее выполнения, и получили ее результат с помощью метода get()
. Если задача еще не выполнена, метод get()
будет блокировать выполнение программы до завершения задачи.