Demostración de cron en Go - Múltiples rutinas ejecutándose en paralelo

Ejemplos e implementación del paquete cron para Golang (Go)

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.

Demostración de cron en Go - Múltiples rutinas ejecutándose en paralelo
Demostración de cron en Go – Múltiples rutinas ejecutándose en paralelo

Nota: si no sabes qué es cron, mira la wikipedia.

Instalar paquete de cron en Go

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"

Primer vistazo al cron de Go

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.

Ejemplos simple de cron con Go

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.

Ejemplos de uso de cron y Go

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.

Conclusiones

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.

Estoy aquí para ayudarte 🤝💻


Estoy aquí para ayudarte en todo lo que necesites. Si requieres alguna modificación en lo presentado en este post, deseas asistencia con tu tarea, proyecto o precisas desarrollar un software a medida, no dudes en contactarme. Estoy comprometido a brindarte el apoyo necesario para que logres tus objetivos. Mi correo es parzibyte(arroba)gmail.com, estoy como@parzibyte en Telegram o en mi página de contacto

No te pierdas ninguno de mis posts 🚀🔔

Suscríbete a mi canal de Telegram para recibir una notificación cuando escriba un nuevo tutorial de programación.

Dejar un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *