Ir al contenido principal

Hablemos de ... Goroutines

Ahora vamos a programar en Go

Una de las peculiaridades del lenguaje Go son las goroutines, la cual es una forma de crear hilos de ejecución livianos y gestionables por el sistema operativo (un concepto similar a los hilos en Java).

Una goroutine se considera una unidad ligera de ejecución en Go. Se lanzan con la palabra go y las gestiona el runtime de Go (scheduler). Son mucho más ligeras que los hilos del sistema operativo.

Digamos que es una función o método que se ejecuta simultáneamente con otras goroutines en el mismo espacio de direcciones.

Características principales:

  • Es una función que se ejecuta concurrentemente con otras dentro del mismo programa. 
  • Ocupan muy poca memoria (unos pocos KB frente a MB de un hilo). 
  • No dependen del sistema operativo, sino del runtime de Go, que las programa sobre un conjunto de hilos del sistema.
  • Se lanzan en microsegundos, mucho más rápido que crear un hilo.

Las goroutines son abstracciones de concurrencia más eficientes que los hilos, aunque internamente se apoyan en un pool de hilos gestionados por Go. Son similares a los hilos de Java, pero más eficientes y con mejor gestión. Son ideales para tareas paralelas como servidores web, procesamiento de datos, o cualquier operación que pueda ejecutarse en segundo plano.

Para usar las goroutines nosotros debemos:

  • Siempre usar canales (chan) para sincronizar y comunicar datos entre goroutines
  • Evitar condiciones de carrera: aunque son ligeras, comparten memoria, por lo que hay que coordinar acceso concurrente.

Empezando con las goroutines

Crearemos un sencillo "Hola, mundo" usando goroutines.

main.go

package main

import (
    "fmt"
    "time"
)

func saludar(nombre string) {
    fmt.Println("Hola,", nombre)
}

func main() {
    go saludar("Alquimista") // se ejecuta concurrentemente
    go saludar("Mundo")   // otra goroutine

    // Esperamos un poco para que las goroutines terminen
    time.Sleep(time.Second)
    fmt.Println("Programa terminado")
}

Lanzamos la función como goroutine. El programa principal no espera a que termine esa función.

Usamos time.Sleep para dar tiempo a que las goroutines se ejecuten antes de que finalice main.

Compilamos y ejecutamos:

$ go build main.go
$ ./main

Salida:

Hola, Mundo
Hola, Alquimista
Programa terminado

Ahora calculemos la aceleración dada una velocidad final (30 m/s), una velocidad inicial (10 m/s) y un tiempo determinado (4s).

main.go

package main

import (
    "fmt"
    "time"
)


func calcularAceleracion(vf, vi, t float64, resultado chan float64) {
    aceleracion := (vf - vi) / t
    resultado <- aceleracion // enviamos el resultado al canal
}

func main() {
    vf := 30.0 // velocidad final (m/s)
    vi := 10.0 // velocidad inicial (m/s)
    t := 4.0   // tiempo (s)

    resultado := make(chan float64)

    go calcularAceleracion(vf, vi, t, resultado)

    fmt.Println("Calculando aceleración en segundo plano...")

    aceleracion := <-resultado
    fmt.Printf("La aceleración es: %.2f m/s²\n", aceleracion)

    time.Sleep(time.Second)
    fmt.Println("Programa terminado")
}

En este programa:

  • Creamos un canal resultado para comunicar la goroutine con main
  • La función calcularAceleracion se ejecuta como goroutine y envía el valor calculado al canal. 
  • El main recibe el valor con <-resultado y lo imprime.

Esto permite que el cálculo se haga concurrentemente, mientras el programa principal puede seguir ejecutando otras tareas.

Compilamos y ejecutamos:

$ go build main.go
$ ./main

Salida:

Calculando aceleración en segundo plano...
La aceleración es: 5.00 m/s²
Programa terminado

Hemos visto que las goroutines son muy útiles para los desarrollos modernos donde la concurrencia y la eficiencia en la gestión de recursos es muy importante.

Vamos a continuar con este tema en próximas entregas.

Enlaces:

https://go.dev/
https://gobyexample.com/
https://alquimistadecodigo.blogspot.com/2025/12/creando-proyectos-con-go.html
https://alquimistadecodigo.blogspot.com/2026/04/creando-proyectos-go-con-go-blueprint.html


Comentarios

Entradas populares de este blog

Programación Windows Batch (CMD) parte 3

Crear ciclos para efectuar operaciones tediosas nos ahorrará tiempo para realizar otras tareas. En está ocasión veremos ciclos con FOR . ¿Cuál es la síntaxis de bucle FOR en Windows Batch? Si está dentro de un archivo *.bat : FOR %%variable IN (seq) DO operaciones Si lo ejecutamos en una terminal: FOR %variable IN (seq) DO operaciones Ejemplo 1 . Recorrer una secuencia de números del 0 al 5: recorrer.bat @ echo off FOR %%i in ( 0 1 2 3 4 5 ) DO echo Hola no. %%i pause Nos imprimirá en pantalla: Hola no. 0 Hola no. 1 Hola no. 2 Hola no. 3 Hola no. 4 Hola no. 5 ¿Puedo usar contadores? Si, se pueden usar. Ejemplo 2 . Uso de contadores: contador.bat @ echo off set numeros = 1 2 3 4 5 6 7 8 9 10 set cont = 0 for %%a in ( %numeros% ) do ( echo Hola no. %%a :: Contador set /a cont+ = 1 ) echo Total: %cont% Este código nos imprimirá, además de los mensajes Hola no. 0 ..., el total de valores conta...

z/OS, ¿Qué es? y ¿Cuáles son sus herramientas?

  En este post veremos las herramientas de z/OS de IBM. z/OS es un sistema operativo de mainframe desarrollado por IBM.  Es parte de la serie IBM z Systems (anteriormente conocida como System z), que se utiliza en los sistemas mainframe de IBM. z/OS es uno de los sistemas operativos más utilizados en el mundo empresarial para ejecutar aplicaciones críticas y procesar grandes volúmenes de datos. Características clave de z/OS: Escalabilidad : z/OS es conocido por su capacidad para manejar grandes cargas de trabajo y escalabilidad vertical, lo que permite agregar recursos de hardware para satisfacer las demandas de procesamiento. Confiabilidad y disponibilidad : z/OS está diseñado para ofrecer alta disponibilidad y confiabilidad. Incorpora características como redundancia y recuperación ante fallas para garantizar la continuidad de las operaciones. Seguridad : Proporciona una amplia gama de funciones de seguridad, como autenticación, autorización y auditoría, para proteger los...

Programación Windows Batch (CMD)

En esta serie de post aprenderemos cómo crear nuestros propios archivos Windows Batch. 1. ¿Por qué aprender Batch en Windows? Una de las razones es que, queramos o no, algún día tendremos que trabajar usando sistemas operativos Windows. Crear scripts nos puede servir para realizar tareas que parecen sencillas en un principio, pero que pueden llegar a ser tediosas (ej. crear múltiples carpetas, comprobar la existencia de un archivo, realizar respaldos, etc.). 2. ¿Cómo puedo crear un archivo Batch en Windows? Los archivos batch en Windows pueden ser escritos con las extensiones *.bat o *.cmd. Pueden contener una serie de comandos y secuencias de instrucciones para realizar diversas tareas. Ejemplo 1. Conocer  el nombre del usuario. usuario.bat @ echo off echo Hola %USERNAME% pause GOTO Comentario -- esto es un comentario multi línea que no se interpretará en MS-DOS -- :Comentario En el anterior ejemplo podemos ver que la variable USERNAME conti...