Planificador de tareas en Go (Golang): guía para implementar tareas cron

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

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/v3


Ejemplo 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:

Recommendations