Использование взбивания сельдерея в качестве таймера
В моем приложении я хочу запускать некоторую функцию один раз через определенный промежуток времени с момента создания объекта. Является ли django-celery-beat подходящим инструментом для этого?
Если вы рассматриваете возможность использования django-celery-beat, но у вас всего несколько задач для планирования, настройка Celery может показаться излишеством, поскольку конфигурация иногда может отнимать много времени. В таких случаях django-rq предоставляет более простую альтернативу, предлагая аналогичную функциональность для фоновых задач, используя Redis в качестве брокера сообщений.
Вот как начать работу с django-rq:
- Установите django-rq .
pip install django-rq
- Добавьте django_rq в INSTALLED_APPS .
INSTALLED_APPS = [ # Другие приложения... 'django_rq', ]
- Настройте параметры Redis для django-rq Добавьте эту конфигурацию в ваш файл настроек:
RQ_QUEUES = { 'default': { 'HOST': 'localhost', 'PORT': 6379, 'DB': 0, 'DEFAULT_TIMEOUT': 360, } }
- Определите задачу Определите функцию, выполняющую задачу, которую вы хотите запланировать. Например, следующая задача получает объект по идентификатору и выполняет указанное действие:
# tasks.py in your app from myapp.models import MyModel def my_scheduled_task(object_id): obj = MyModel.objects.get(id=object_id) # Perform the desired action here print(f"Running task for object {obj}")
- Запланировать задачу при сохранении нового экземпляра модели Вот пример использования метода Django model save() для планирования задачи через 24 часа после создания нового объекта:
# models.py in your app from django.db import models from django.utils import timezone from datetime import timedelta import django_rq from myapp.tasks import my_scheduled_task class MyModel(models.Model): created_at = models.DateTimeField(auto_now_add=True) def save(self, *args, **kwargs): is_new = self.pk is None super().save(*args, **kwargs) # Schedule the task only if this is a new object if is_new: scheduler = django_rq.get_scheduler('default') run_at = timezone.now() + timedelta(hours=24) scheduler.enqueue_at(run_at, my_scheduled_task, self.id)
- Запустите рабочий и планировщик В отдельных окнах терминала выполните следующие команды:
python manage.py rqworker default
python manage.py rqscheduler
Краткое описание django-rq предоставляет легкую очередь задач с поддержкой Redis, которая может быть идеальной для небольших задач без необходимости полной настройки Celery. Она эффективно обрабатывает запланированные и фоновые задачи с минимальной настройкой.
Да, Celery Beat хорошо подходит для фоновых задач. Однако иногда интегрировать Celery в наш проект бывает сложновато. Если у вас есть небольшая задача для фонового процесса, я рекомендую использовать django-rq.
Вот официальная ссылка для ознакомления: