1. Introducción
La librería cron de Golang es una herramienta poderosa y fácil de usar que permite programar tareas para que se ejecuten en momentos o intervalos específicos. Está modelada según el servicio cron de UNIX, pero se implementa como una biblioteca independiente que se puede integrar en las aplicaciones de Go. La librería cron se encarga de la programación basada en el tiempo, dejándote enfocarte en la tarea que necesita ser ejecutada.
2. Ejemplo
Instalando la librería cron
Para comenzar a usar la librería cron en tu proyecto, primero necesitas instalarla usando el comando go get
:
go get github.com/robfig/cron/[email protected]
Importar el paquete cron
Después de instalarla, puedes importarla en tu programa de Go de la siguiente manera:
import "github.com/robfig/cron/v3"
Aquí tienes un ejemplo sencillo de cómo configurar una tarea Cron que imprime un mensaje cada minuto:
package main
import (
"fmt"
"github.com/robfig/cron/v3"
)
func main() {
c := cron.New()
c.AddFunc("0 30 * * * *", func() { fmt.Println("Cada hora en punto medio") })
c.AddFunc("@hourly", func() { fmt.Println("Cada hora") })
c.AddFunc("@every 1h30m", func() { fmt.Println("Cada hora y treinta") })
c.Start()
..
// Las funciones se invocan en su propia goroutine, de forma asíncrona.
...
// También se pueden agregar funciones a un Cron en ejecución
c.AddFunc("@daily", func() { fmt.Println("Cada día") })
..
..
c.Stop() // Detiene el planificador (no detiene las tareas que ya están en ejecución).
}
3. Formato de la Expresión CRON
Una expresión cron representa un conjunto de momentos, utilizando 6 campos separados por espacio.
Nombre del campo | ¿Obligatorio? | Valores permitidos | Caracteres especiales permitidos |
---|---|---|---|
Segundos | Sí | 0-59 | * / , - |
Minutos | Sí | 0-59 | * / , - |
Horas | Sí | 0-23 | * / , - |
Día del mes | Sí | 1-31 | * / , - ? |
Mes | Sí | 1-12 o ENE-DIC | * / , - |
Día de la semana | Sí | 0-6 o DOM-SÁB | * / , - ? |
4. Caracteres Especiales en las Expresiones CRON
- Asterisco ( * ) El asterisco representa todos los valores posibles para el campo dado. Por ejemplo, un asterisco en el campo de los minutos significa cada minuto.
- Barra ( / ) El caracter barra se utiliza para especificar incrementos. Por ejemplo, "*/15" en el campo de los segundos significa cada 15 segundos a partir de cero.
- Coma ( , ) El caracter coma se utiliza para listar múltiples valores discretos. Por ejemplo, "LUN,MIE,VIE" en el campo del día de la semana significa que la tarea se ejecutará los lunes, miércoles y viernes.
- Guion ( - ) El guion denota un rango de valores. "9-17" en el campo de las horas indica cada hora de 9 AM a 5 PM.
- Signo de interrogación ( ? ) El signo de interrogación se puede utilizar en los campos del día del mes y del día de la semana para significar 'ningún valor específico', lo cual es útil cuando necesitas especificar un valor para uno y no para el otro.
5. Horarios Predefinidos
Explicación detallada de los horarios predefinidos disponibles, mostrados en formato de tabla:
Entrada | Descripción | Equivalente A |
---|---|---|
@yearly (o @annually) | Ejecutar una vez al año, a medianoche, el 1 de enero | 0 0 0 1 1 * |
@monthly | Ejecutar una vez al mes, a medianoche, el primer día del mes | 0 0 0 1 * * |
@weekly | Ejecutar una vez a la semana, a medianoche entre sábado y domingo | 0 0 0 * * 0 |
@daily (o @midnight) | Ejecutar una vez al día, a medianoche | 0 0 0 * * * |
@hourly | Ejecutar una vez en hora, al comienzo de la hora | 0 0 * * * * |
6. Intervalos y programación de intervalos fijos
La programación de trabajos para ejecutarse en intervalos fijos es otra característica poderosa de la biblioteca cron. Por ejemplo, para programar un trabajo que se ejecute cada 2 horas:
c.AddFunc("@every 2h", func() { fmt.Println("El trabajo se ejecuta cada dos horas") })
7. Zonas horarias y programación de trabajos
La interpretación y programación se realizan en la zona horaria local de la máquina donde se está ejecutando la aplicación en Go. Es importante tener cuidado durante los cambios de horario de verano, ya que ciertos momentos pueden no existir o repetirse.
8. Seguridad en la ejecución concurrente y sincronización
La biblioteca cron está diseñada para ser segura en la ejecución concurrente y en subprocesos. Es crucial que el llamante mantenga una secuencia correcta de invocaciones de métodos para evitar condiciones de carrera. Se deben utilizar mecanismos de sincronización adecuados cuando sea necesario para garantizar que los trabajos se programen y se ejecuten correctamente.