Hoy vengo a mostrar cómo usar el maravilloso paquete de cron para Go. Ya todos sabemos qué es cron, que en términos simples permite ejecutar acciones cada determinado tiempo.
Pues bien, hoy veremos cómo usar el cron pero directamente programado en Go; sin ninguna dependencia más que del paquete y del propio lenguaje. Veremos algunos ejemplos.
Nota: si no sabes qué es cron, mira la wikipedia.
Primero instala y configura Go (si estás en Linux mira esto) y luego instala el paquete que se encuentra en github.com/robfig/cron con el siguiente comando:
go get github.com/robfig/cron
Espera a que termine y ya estamos preparados. Recuerda que para importar se usa:
import "github.com/robfig/cron"
Se crea un nuevo “cron” con:
c := cron.New()
Después, se pueden agregar funciones que se van a ejecutar cuando indiquemos; para esto se llama a c.AddFunc
. Como primer argumento se le pasa la expresión cron y como segundo una función.
Ya veremos los ejemplos más abajo. Por cierto, una vez que ya hemos agregado todas las tareas, para iniciar el cron se llama a:
c.Start()
Para detenerlas o detener el cron se llama a:
c.Stop()
Finalmente, es posible agregar tareas incluso después de llamar a Start
, no hay problema con ello.
Por cierto, aquí está la documentación oficial.
Aquí está un ejemplo sencillo y rápido que funciona como referencia:
package main
/*
Ejemplo simple de cómo usar cron en Go
@author parzibyte
*/import (
"fmt"
"github.com/robfig/cron"
)
func main() {
// Crear un cron
c := cron.New()
// Por cierto, al terminar lo detenemos
// https://parzibyte.me/blog/2018/12/18/defer-go/
defer c.Stop()
// Agregarle funciones...
// Ejecutar cada segundo toda la vida
c.AddFunc("* * * * * *", func() {
fmt.Println("Me imprimo cada segundo")
})
// Comenzar
c.Start()
// Lo siguiente es únicamente para pausar el programa y no tiene nada
// que ver con cron o el ejemplo, recuerda que
// el programa se detiene con Ctrl + C
select {}
}
Si lo compilas y/o ejecutas, en la consola se estará imprimiendo el mensaje cada segundo; pero eso no es todo, hay magia detrás de ello.
Eso que estás viendo se está ejecutando en otro hilo, y si agregaras más funciones entonces todas se ejecutarían en paralelo; dejando el código principal intacto.
Además, esto fue para ejemplos rápidos, pero todos sabemos que cron podría ejecutar determinada acción cada mes, año, todos los martes, todos los miércoles de enero del 2020 y miles de combinaciones más.
Una vez que ya vimos el ejemplo básico, veamos uno más avanzado que tendrá la salida de la imagen de portada (la del inicio):
package main
/*
Segundo ejemplo de cómo usar cron en Go
@author parzibyte
*/import (
"fmt"
"github.com/robfig/cron"
"time"
)
func main() {
// Crear un cron
c := cron.New()
// Por cierto, al terminar lo detenemos
defer c.Stop()
// Agregarle funciones...
// Ejecutar en los segundos que sean múltiplos de 10
// es decir, en el minuto con 10, 20, y hasta 60 segundos
c.AddFunc("*/10 * * * * *", func() {
fmt.Printf("Me estoy imprimiendo cada múltiplo de 10 segundos. La hora es %s\n", obtenerHoraActual())
})
// Ejecutar en los segundos que sean múltiplos de 30
// (es decir, en el minuto con 0 segundos y en el minuto con 30 segundos)
c.AddFunc("*/30 * * * * *", decirHola)
//Cada segundo con función anónima
c.AddFunc("* * * * * *", func() {
fmt.Printf("Me ejecuto cada segundo. La hora es %s\n", obtenerHoraActual())
})
//Todos los martes a las 12 con 58 en punto
c.AddFunc("0 58 12 * * 2", func() {
fmt.Printf("Me ejecuto los martes a las 12:58:00. La hora es %s\n", obtenerHoraActual())
})
// Comenzar
c.Start()
// Lo siguiente es únicamente para pausar el programa y no tiene nada
// que ver con cron o el ejemplo, recuerda que
// el programa se detiene con Ctrl + C
select {}
}
func obtenerHoraActual() string {
t := time.Now()
return t.Format("15:4:5")
}
func decirHola() {
fmt.Printf("Yo me ejecuto en cada 30 segundos. La hora es %s\n", obtenerHoraActual())
}
En el ejemplo usamos a cron para agregar múltiples tareas; aquí la concurrencia no importa tanto, sino la ejecución puntual de las tareas. Es decir, cron funciona de maravilla.
Cabe mencionar que se pueden agregar infinitas tareas y que el select{}
al final solamente funciona para pausar el programa; pero no sería necesario para programas como el del servidor web.
Por cierto, esta implementación de cron en Go utiliza hasta segundos como medida más precisa; y el estándar en Linux utiliza minutos. En resumen, se podría decir que este cron tiene mayor granularidad.
¿Te confundes al trabajar con cron? yo también, pero siempre recurro a esta página para guiarme; eso sí, la página no maneja segundos pero no importa; pues sirve como guía.
Como siempre, te invito a ver más tutoriales de Go.
Hoy te voy a presentar un creador de credenciales que acabo de programar y que…
Ya te enseñé cómo convertir una aplicación web de Vue 3 en una PWA. Al…
En este artículo voy a documentar la arquitectura que yo utilizo al trabajar con WebAssembly…
En un artículo anterior te enseñé a crear un PWA. Al final, cualquier aplicación que…
Al usar Comlink para trabajar con los workers usando JavaScript me han aparecido algunos errores…
En este artículo te voy a enseñar cómo usar un "top level await" esperando a…
Esta web usa cookies.