Planificador de tareas en Go (Golang): desde un simple ticker hasta un cron industrial
Un planificador de tareas (task scheduler) es un componente que permite ejecutar funciones específicas en un momento determinado o con una periodicidad determinada. En el ecosistema de Go (Golang), existen varios enfoques para implementar un planificador: desde primitivas integradas del lenguaje hasta potentes bibliotecas de terceros. En este artículo, analizaremos cómo crear un planificador de tareas en Go, comenzando con ejemplos simples y terminando con el uso de la popular biblioteca robfig/cron.
¿Por qué necesitas un planificador de tareas en Go?
Go es ideal para crear aplicaciones de servidor de alto rendimiento, microservicios y utilidades de línea de comandos. Un planificador de tareas permite automatizar operaciones rutinarias:
- Limpieza de caché o archivos temporales
- Envío de notificaciones periódicas (email, SMS)
- Recopilación de métricas y monitoreo
- Sincronización de datos con API externas
- Generación de informes programados
Planificador básico usando time.Ticker
La forma más sencilla de ejecutar una tarea cada N segundos es usar time.Ticker. Esta herramienta integrada de Go envía un valor al canal en intervalos de tiempo determinados.
package main
import ( "fmt" "time")
func main() { ticker := time.NewTicker(2 * time.Second) done := make(chan bool)
go func() { for { select { case <-ticker.C: fmt.Println("Tarea ejecutada:", time.Now().Format(time.RFC3339)) case <-done: ticker.Stop() return } } }()
// Detendremos el planificador después de 10 segundos time.Sleep(10 * time.Second) done <- true fmt.Println("Planificador detenido")}Este código crea una goroutine que imprime la hora actual cada 2 segundos. Observe el uso de select: este es un patrón clave de Go para el manejo no bloqueante de múltiples canales.
Planificador con horario flexible: biblioteca robfig/cron
Para proyectos reales que requieren un horario similar a cron (por ejemplo, "cada lunes a las 9:00" o "cada 5 minutos de 9 a 18"), la mejor opción es la biblioteca github.com/robfig/cron/v3. Admite completamente la sintaxis estándar de cron y agrega funciones útiles, como el manejo de zonas horarias y el tratamiento de pánicos.
Instalación
go get github.com/robfig/cron/v3Ejemplo de uso
package main
import ( "fmt" "log" "time"
"github.com/robfig/cron/v3")
func main() { c := cron.New(cron.WithSeconds()) // Habilitamos soporte para segundos
// Agregamos una tarea: cada 10 segundos _, err := c.AddFunc("*/10 * * * * *", func() { fmt.Println("Tarea 1: cada 10 segundos", time.Now().Format(time.RFC3339)) }) if err != nil { log.Fatal(err) }
// Tarea: cada día a las 14:30 UTC _, err = c.AddFunc("0 30 14 * * *", func() { fmt.Println("Tarea 2: diariamente a las 14:30 UTC") }) if err != nil { log.Fatal(err) }
// Tarea con nombre para gestión posterior entryID, _ := c.AddFunc("@every 1m", func() { fmt.Println("Tarea 3: cada minuto") })
c.Start()
// Eliminamos la tarea después de 5 minutos time.Sleep(5 * time.Minute) c.Remove(entryID) fmt.Println("Tarea 3 eliminada")
// Bloqueamos main select {}}La biblioteca admite varios formatos de horario:
- Cron estándar:
"30 * * * *"— cada 30 minutos - Con segundos:
"0 30 * * * *"— en el segundo 30 de cada minuto - @every:
"@every 5m"— cada 5 minutos También en la biblioteca
Migraciones de bases de datos en Kotlin: herramientas y ejemplos prácticos
Trabajo con Apache Kafka en Go (Golang): bibliotecas y ejemplos
Planificador de tareas Java: Quartz Scheduler — guía completa
Configuración de aplicaciones Swift: biblioteca SwiftyConfig
Trabajo con S3 y almacenamiento en la nube en C# (.NET): biblioteca AWS SDK
Recommendations