Celery – мощная асинхронная очередь задач, которая позволяет разгрузить ваш Django проект, выполняя ресурсоемкие операции в фоновом режиме. Управление Celery из командной строки (CLI) предоставляет гибкие возможности для запуска, мониторинга и отладки задач. Эта статья предоставит вам подробное руководство по эффективному использованию Celery CLI в вашем Django проекте.
Предварительная подготовка: Настройка Celery и Django
Прежде чем начать запускать задачи Celery из командной строки, необходимо убедиться, что Celery правильно настроен и интегрирован с вашим Django проектом.
Установка и настройка Celery, Django, брокера сообщений (Redis/RabbitMQ).
-
Установите Celery и брокер сообщений (например, Redis или RabbitMQ) с помощью pip:
pip install celery redis -
Установите Django:
pip install django -
Redis/RabbitMQ должны быть установлены и запущены на вашей системе.
Настройка Django проекта для работы с Celery (settings.py, tasks.py).
-
В файле
settings.pyвашего Django проекта добавьте настройки Celery:# settings.py CELERY_BROKER_URL = 'redis://localhost:6379/0' # Пример для Redis CELERY_RESULT_BACKEND = 'redis://localhost:6379/0' CELERY_ACCEPT_CONTENT = ['application/json'] CELERY_TASK_SERIALIZER = 'json' CELERY_RESULT_SERIALIZER = 'json' CELERY_TIMEZONE = 'Europe/Moscow' -
Создайте файл
celery.pyв корневой директории вашего Django проекта (рядом сmanage.py):# celery.py import os from celery import Celery # Установите Django settings module. os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'your_project.settings') app = Celery('your_project') # Загрузите настройки Celery из Django settings. app.config_from_object('django.conf:settings', namespace='CELERY') # Автоматическое обнаружение tasks. app.autodiscover_tasks() @app.task(bind=True) def debug_task(self): print(f'Request: {self.request!r}') -
Добавьте следующий код в файл
__init__.pyв той же директории, где находитсяcelery.py:# __init__.py from .celery import app as celery_app __all__ = ('celery_app',) -
Создайте файл
tasks.pyв одном из ваших Django приложений, где будут определены Celery задачи:# your_app/tasks.py from celery import shared_task @shared_task def add(x, y): return x + y
Запуск Celery worker из командной строки: Основы
Запуск Celery worker осуществляется с помощью команды celery.
Базовая команда для запуска Celery worker: celery -A <project_name> worker -l info.
-
<project_name>– имя вашего Django проекта (то, что указано вsettings.pyкакROOT_URLCONF). -
worker– указывает, что нужно запустить worker. -
-l info– устанавливает уровень логирования наinfo.
Пример:
celery -A your_project worker -l info
Параметры командной строки: -l (logging level), -c (concurrency), -n (hostname).
-
-lили--loglevel: Уровень логирования (debug, info, warning, error, fatal). По умолчанию: INFO. -
-cили--concurrency: Количество процессов-воркеров. По умолчанию: количество CPU ядер. -
-nили--hostname: Имя хоста для воркера. Полезно при мониторинге.
Пример:
celery -A your_project worker -l debug -c 4 -n worker1@example.com
Запуск Celery задач: Синхронный и асинхронный подходы
Вызов Celery задач из Django shell и views (синхронно и асинхронно).
-
Из Django shell:
from your_app.tasks import add # Асинхронный вызов result = add.delay(4, 4) print(result.id) # ID задачи # Синхронный вызов (для отладки, не рекомендуется в production) result = add(4, 4) print(result) # 8 -
Из Django views:
from django.http import HttpResponse from your_app.tasks import add def my_view(request): result = add.delay(4, 4) return HttpResponse(f'Task ID: {result.id}')Реклама
Использование delay(), apply_async() для отложенного выполнения задач.
-
delay(*args, **kwargs)– сокращенная форма дляapply_async(args=args, kwargs=kwargs). -
apply_async()– более гибкий метод, позволяющий настроить параметры выполнения задачи (countdown, eta, expires, queue, etc.).
Пример:
from your_app.tasks import add
# Запуск задачи через 10 секунд
result = add.apply_async(args=[4, 4], countdown=10)
# Запуск задачи в определенное время (ETA)
import datetime
eta = datetime.datetime.now() + datetime.timedelta(minutes=5)
result = add.apply_async(args=[4, 4], eta=eta)
Продвинутые техники: Управление Celery из командной строки
Запуск Celery beat для периодического выполнения задач.
Celery Beat – планировщик, который периодически запускает задачи.
-
Добавьте настройки Celery Beat в
settings.py:# settings.py CELERY_BEAT_SCHEDULER = 'django_celery_beat.schedulers:DatabaseScheduler' -
Установите
django-celery-beat:pip install django-celery-beat -
Добавьте
'django_celery_beat'вINSTALLED_APPS. -
Выполните миграции:
python manage.py migrate -
Запустите Celery Beat из командной строки:
celery -A your_project beat -l info
Мониторинг и управление задачами Celery с помощью инструментов командной строки и веб-интерфейсов.
-
celery inspect: Позволяет инспектировать состояние Celery worker (активные задачи, резервированные задачи, статистика).celery -A your_project inspect active celery -A your_project inspect reserved celery -A your_project inspect stats -
celery control: Позволяет отправлять команды Celery worker (shutdown, ping, rate limit).celery -A your_project control shutdown celery -A your_project control ping celery -A your_project control rate_limit add 10/m #ограничение задачи add до 10 вызовов в минуту -
Flower: Веб-интерфейс для мониторинга Celery. Установите
flowerс помощьюpip install flowerи запустите командойcelery -A your_project flower.
Решение проблем: Устранение типичных ошибок при запуске Celery
Разбор наиболее распространенных ошибок: импорт ошибок, проблемы с брокером сообщений, неправильная конфигурация.
-
ImportError: Проверьте, что все необходимые модули установлены и доступны.
-
ConnectionRefusedError: Убедитесь, что брокер сообщений (Redis/RabbitMQ) запущен и доступен по указанному адресу.
-
ConfigurationError: Проверьте правильность настроек Celery в
settings.py. -
Task not found: Убедитесь, что задача правильно определена и зарегистрирована Celery.
Рекомендации по отладке и логированию для выявления проблем.
-
Установите уровень логирования на
DEBUG(-l debug). -
Используйте
try...exceptблоки в задачах для обработки исключений и логирования ошибок. -
Проверьте логи Celery worker и брокера сообщений.
-
Используйте инструменты мониторинга (Flower) для отслеживания состояния задач.
Заключение: Эффективное использование Celery в Django проектах
Управление Celery из командной строки предоставляет разработчикам Django мощный инструмент для контроля над асинхронными задачами. Правильная настройка, понимание параметров командной строки и использование инструментов мониторинга помогут вам эффективно использовать Celery для повышения производительности и масштабируемости вашего проекта. Не забывайте про отладку и логирование для своевременного выявления и устранения проблем.