En la entrega anterior, aprendimos sobre Django-Celery-Beat: Cómo crear tareas programadas, mediante el cual exploramos la forma básica de crear tareas programadas en Django-Celery-Beat.

📌 ¡Haz clic en el título para revisar la publicación anterior!

Sin embargo, en proyectos reales, a menudo no es suficiente simplemente ejecutar repetidamente en un horario programado.

  • Puede que sea necesario limitar la ejecución a horarios específicos,
  • cambiar dinámicamente el ciclo de ejecución,
  • desactivar la tarea bajo ciertas condiciones,
  • o configurar que automáticamente se desactive después de una fecha específica.

Para abordar esta lógica compleja, en esta entrega profundizaremos en el modelo PeriodicTask de Django-Celery-Beat, explorando diversos campos y métodos de configuración. 🚀

Django Celery-Beat PeriodicTask illustration

1️⃣ Configuración de PeriodicTask utilizando update_or_create

En servicios reales, es más común modificar las tareas programadas en respuesta a solicitudes de usuarios y cambios en el entorno, en lugar de simplemente dejarlas tal como se crearon.

Por lo tanto, es más útil utilizar update_or_create() en lugar de PeriodicTask.objects.create().

📌 Al utilizar update_or_create(),

  1. se actualiza si la tarea ya existe
  2. se crea una nueva si no existe

Es decir, se permite sustituir tareas programadas con el mismo nombre, evitando instancias duplicadas innecesarias.

2️⃣ Campo PeriodicTask.interval y modelo IntervalSchedule

En Django-Celery-Beat, PeriodicTask permite configurar el intervalo de repetición a través del campo interval.

Este campo interval está asociado con el modelo IntervalSchedule, por lo que primero se debe crear una instancia de IntervalSchedule para luego referenciarla en PeriodicTask.

Así que, para registrar una tarea programada:

  1. Primero se crea una instancia de IntervalSchedule
  2. Luego se conecta la IntervalSchedule recién creada a PeriodicTask

3️⃣ Opciones de campo de IntervalSchedule

Nombre del campo Descripción Ejemplo de valor
every Valor numérico del período de repetición 10, 30, 2
period Unidad del período de repetición IntervalSchedule.SECONDS, IntervalSchedule.MINUTES, IntervalSchedule.HOURS, IntervalSchedule.DAYS

4️⃣ Ejemplo de configuración de PeriodicTask utilizando update_or_create

from django_celery_beat.models import PeriodicTask, IntervalSchedule
import json

# Crear IntervalSchedule (ejecución cada 10 minutos)
schedule, created = IntervalSchedule.objects.get_or_create(
    every=10,
    period=IntervalSchedule.MINUTES
)

# Crear o actualizar PeriodicTask
task, created = PeriodicTask.objects.update_or_create(
    name="send_reminder_email",
    defaults={
        "interval": schedule,
        "task": "myapp.tasks.send_reminder_email",
        "args": json.dumps([1]),
        "enabled": True,
    }
)

5️⃣ Otras descripciones de campos del PeriodicTask

Nombre del campo Descripción Ejemplo
name Nombre único de la tarea "send_report_task"
interval Intervalo de ejecución (Referencia IntervalSchedule) schedule
crontab Para ejecutar a horarios específicos (Referencia CrontabSchedule) None
clocked Ejecutar solo una vez a una hora específica (Referencia ClockedSchedule) None
task Tarea de Celery a ejecutar "myapp.tasks.send_report"
args Argumentos a pasar a la función (formato JSON) json.dumps([123, "email@example.com"])
kwargs Argumentos de palabra clave para la función (formato JSON) json.dumps({"priority": "high"})
enabled Estado de ejecución True o False
one_off Ejecutar solo una vez y finalizar True o False

📌 Si se establece one_off=True, la tarea se desactivará después de ejecutarse una vez, pero no se eliminará.

📌 Utilizando el campo clocked se puede programar una tarea que se ejecute una vez a una hora específica precisa.

🎯 Conclusión: ¡Utiliza update_or_create para gestionar tareas programadas con flexibilidad!

📌 Al registrar tareas programadas en Django-Celery-Beat, utilizar update_or_create() permite modificar fácilmente tareas existentes.

📌 El campo PeriodicTask.interval se refiere a IntervalSchedule, así que primero se debe crear la instancia de IntervalSchedule y luego conectarse a ella.

📌 Para gestionar tareas programadas complejas, utilizar campos como args, kwargs, enabled, one_off, clocked puede facilitar la configuración.

🔥 Avance del próximo capítulo

En esta entrega, aprendimos sobre cómo crear y modificar PeriodicTask de manera más flexible.

En la próxima entrega, trataremos la configuración de tareas programadas utilizando Crontab para ejecuciones en momentos específicos, así como el uso de Clocked para ejecutar tareas solo una vez a una hora específica.

¡Esperamos que estés ansioso por conocer más sobre el uso de Celery en el próximo episodio! 🚀

Y si deseas ver más artículos relacionados con Celery en el blog,

¡consulta la lista de 'Publicaciones similares' a continuación o busca "Celery" en la barra de búsqueda en la parte superior derecha! 😊