En el artículo anterior, exploramos cómo gestionar tareas programadas utilizando Django-Celery-Beat: Ejemplo práctico de tarea programada con PeriodicTask mediante IntervalSchedule.

Sin embargo, en proyectos reales, a menudo el método de ejecución repetida (interval) no es suficiente.

  • Cuando se necesita una tarea que se ejecute a una hora específica cada día.
  • Cuando se necesita una tarea que se ejecute una sola vez en una fecha y hora específicas.

En estos casos, usar el método de programación Crontab o Clocked permite establecer tareas programadas más precisas. 🚀

📌 ¿No estás familiarizado con el concepto de Crontab?

➡️ Entendiendo Linux `crontab`: Consejos de programación automática que a los desarrolladores les encantan

¡Si lees ese artículo primero, te será más fácil entenderlo! 😊

Django Celery-Beat task scheduling with Crontab and Clocked

1️⃣ Reservas a una hora específica utilizando `CrontabSchedule`

Crontab es un método de programación de tareas utilizado en Linux, que permite programar tareas para que se ejecuten en momentos específicos como segundo/minuto/hora/día de la semana/día del mes.

En Django-Celery-Beat, también podemos utilizar `CrontabSchedule` para establecer tareas programadas de la misma manera.

📌 Ejemplo: tarea programada que se ejecuta todos los días a las 9:30 a.m.

from django_celery_beat.models import PeriodicTask, CrontabSchedule
import json

# 1️⃣ Crear CrontabSchedule (ejecutándose todos los días a las 09:30)
schedule, created = CrontabSchedule.objects.get_or_create(
    minute="30",
    hour="9",
    day_of_week="*",
    day_of_month="*",
    month_of_year="*"
)

# 2️⃣ Crear o actualizar PeriodicTask
task, created = PeriodicTask.objects.update_or_create(
    name="daily_report_task",
    defaults={
        "crontab": schedule,  # Aplicar CrontabSchedule
        "task": "myapp.tasks.generate_daily_report",
        "args": json.dumps([]),
        "enabled": True,
    }
)

✅ La configuración anterior programa la tarea para que se ejecute todos los días a las 9:30 a.m. 🎯

✅ Descripción de los campos de `CrontabSchedule`

Nombre del campo Descripción Ejemplo
`minute` Configuración del minuto en que se ejecutará "0", "30", "*/10"
`hour` Configuración de la hora en que se ejecutará "0", "9", "*/6"
`day_of_week` Configuración del día de la semana en que se ejecutará (0=Domingo) "*"(todos los días), `"1,3,5"`(Lun/Mié/Vie)
`day_of_month` Configuración del día del mes en que se ejecutará "*"(todos los días), `"1,15"`(1 y 15 de cada mes)
`month_of_year` Configuración del mes en que se ejecutará "*"(todos los meses), `"1,6,12"`(Enero, Junio, Diciembre)

2️⃣ Reservas que se ejecutan una sola vez utilizando `ClockedSchedule`

`ClockedSchedule` se utiliza para establecer tareas programadas que se ejecutan solo una vez en una fecha y hora específicas.

📌 Ejemplo: tarea programada que se ejecuta solo una vez en una fecha específica (10 de febrero de 2025 a las 15:00)

from django_celery_beat.models import PeriodicTask, ClockedSchedule
import json
from datetime import datetime

# 1️⃣ Crear ClockedSchedule (ejecutándose el 10 de febrero de 2025 a las 15:00)
scheduled_time = datetime(2025, 2, 10, 15, 0)  # ¡Es necesario usar un objeto datetime!
schedule, created = ClockedSchedule.objects.get_or_create(
    clocked_time=scheduled_time
)

# 2️⃣ Crear PeriodicTask (¡configurar one_off=True!)
task, created = PeriodicTask.objects.update_or_create(
    name="one_time_task_20250210",
    defaults={
        "clocked": schedule,  # Aplicar ClockedSchedule
        "task": "myapp.tasks.one_time_email",
        "args": json.dumps([]),
        "enabled": True,
        "one_off": True,  # Se desactiva automáticamente después de ejecutar
    }
)

✅ La configuración anterior se ejecutará una sola vez a las 15:00 del 10 de febrero de 2025 y luego se desactivará automáticamente.

  • 📌 Al crear una instancia del modelo ClockedSchedule, el campo clocked_time debe ingresarse como un objeto datetime.
  • 📌 Usar una cadena u otro tipo de datos puede provocar errores.

📌 ¿Cuál es la relación entre ClockedSchedule y la opción one_off?

Al crear una tarea que se ejecuta una sola vez en ClockedSchedule, configuramos one_off=True,
puedes preguntarte cómo interactúa esta configuración con el campo enabled.

📌 ¿Quieres saber más sobre la relación entre estos dos campos (clocked_time y one_off)?

➡️ Relación entre one-off y enabled en Celery Beat: Comprensión y uso correctos

¡Consulta el artículo anterior para entender cómo funciona exactamente `one_off=True` y en qué se diferencia de `enabled`! 😊

🎯 Conclusión: ¡Usar Crontab y Clocked permite programar tareas más precisas!

  • ¡Usando CrontabSchedule, puedes programar tareas que se ejecuten en momentos específicos pero de forma repetitiva!
  • ¡Usando ClockedSchedule, puedes programar tareas que se ejecuten una sola vez en un momento específico!
  • ¡El campo clocked_time de ClockedSchedule debe ingresarse como un objeto datetime!
  • ¡La relación entre ClockedSchedule y la configuración one_off=True será tratada más a fondo en un artículo separado, así que revisa eso!

Si deseas conocer más sobre cómo usar Celery en profundidad,

¡Consulta la lista de 'artículos similares' a continuación o busca `"Celery"` en la barra de búsqueda en la parte superior derecha! 🚀 😊