Planificador de tareas en Go (Golang): cron, gocron y robfig/cron
Un planificador de tareas (task scheduler) es una herramienta indispensable para automatizar operaciones periódicas en aplicaciones: desde la limpieza de caché y el envío de notificaciones hasta la ejecución de procesadores de datos en segundo plano. En el ecosistema de Go (Golang), existen varias bibliotecas populares para implementar un comportamiento similar a cron. En este artículo, analizaremos tres enfoques principales: el paquete integrado cron, el ligero gocron y el estándar de facto robfig/cron.
1. Paquete integrado cron (experimental)
A partir de Go 1.19, la biblioteca estándar incluye un paquete experimental cron en golang.org/x/exp/cron. Proporciona funcionalidad básica para ejecutar tareas según un horario. Sin embargo, en la práctica se usa raramente debido a su funcionalidad limitada y la falta de soporte para expresiones cron complejas (por ejemplo, con segundos).
package main
import ( "context" "fmt" "golang.org/x/exp/cron" "time")
func main() { sched := cron.New() // Ejecución cada 10 segundos sched.Add("*/10 * * * * *", func() { fmt.Println("Tarea ejecutada:", time.Now()) }) sched.Start() time.Sleep(30 * time.Second) sched.Stop()}2. Biblioteca robfig/cron — el estándar de oro
La biblioteca github.com/robfig/cron/v3 es la implementación de planificador de tareas más popular y madura en Go. Soporta:
- Expresiones cron estándar (5 campos) con campo opcional de segundos
- Horarios predefinidos:
@yearly,@monthly,@weekly,@daily,@hourly - Intervalos:
@every 5m(cada 5 minutos) - Zonas horarias (timezone)
- Manejo de pánicos a través del registrador Recovery
- Sistema de registro flexible mediante la interfaz
Logger
Instalación
go get github.com/robfig/cron/v3Ejemplo básico
package main
import ( "fmt" "github.com/robfig/cron/v3" "time")
func main() { c := cron.New(cron.WithSeconds()) // Habilitamos el soporte de segundos
// Cada minuto en el segundo 30 c.AddFunc("30 * * * * *", func() { fmt.Println("Cada minuto en el segundo 30:", time.Now().Format("15:04:05")) })
// Cada día a las 8:00 a.m. c.AddFunc("0 0 8 * * *", func() { fmt.Println("Diariamente a las 8:00") })
// Cada 2 horas c.AddFunc("@every 2h", func() { fmt.Println("Cada 2 horas") })
// Lunes a las 9:30 c.AddFunc("30 9 * * 1", func() { fmt.Println("Cada lunes a las 9:30") })
c.Start() defer c.Stop()
// Esperamos 1 minuto para ver la ejecución time.Sleep(70 * time.Second)}Sintaxis de expresiones cron en robfig/cron
Una expresión estándar consta de 5 campos (minutos, horas, día del mes, mes, día de la semana). Al habilitar la opción cron.WithSeconds(), se agrega un sexto campo: segundos (0-59).
*— cualquier valor*/5— cada 5 unidades1,15,30— valores específicos1-10— rangoL— último (por ejemplo, el último día del mes)
3. Biblioteca gocron — simplicidad y legibilidad
github.com/go-co-op/gocron ofrece una interfaz fluida (fluent) de más alto nivel para crear horarios. Es ideal si no necesitas expresiones cron complejas, sino intervalos simples.
Instalación
go get github.com/go-co-op/gocron/v2Ejemplo de uso
package main
import ( "fmt También en la biblioteca
Spring WebFlux Java: guía completa con ejemplos prácticos
Framework CLI para C++: cppcli — creación de aplicaciones de consola
Trabajo con fechas en Go (Golang): librerías time, carbon y now