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?
¡Si lees ese artículo primero, te será más fácil entenderlo! 😊
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 objetodatetime
. - 📌 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 objetodatetime
! - ¡La relación entre
ClockedSchedule
y la configuraciónone_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! 🚀 😊
Add a New Comment