Planificador de tareas en Go (Golang): cron, gocron y robfig/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): 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/v3


Ejemplo 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 unidades
  • 1,15,30 — valores específicos
  • 1-10 — rango
  • L — ú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/v2


Ejemplo de uso

package main

import ( "fmt

Recommendations