null

Celery в Python: начало

Введение

При разработке бэкенда на 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() будет блокировать выполнение программы до завершения задачи.