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...

TIOBE index 2024

El índice TIOBE (o índice de la comunidad de programación TIOBE) mide la popularidad de los lenguajes de programación. Su índice no se basa en qué lenguaje de programación es mejor, si tiene mejor perfomance, si posee escalabilidad, si es más sencillo de aprender, de usar, de implementar, etc. Sólo se basa en la popularidad. En el número de referencias ya sea en blogs, foros de consulta, etc. No necesariamente si las empresas lo están usando en alguno de sus desarrollos. Este índice es útil para darse una idea qué lenguaje está cobrando más popularidad y prestigio. Enseguida una tabla con los primeros 5 lenguajes más populares. Índice de Noviembre 2024   Nov 2024  Nov 2023  Change  Programming Language  Ratings  Change  1  1    Python  22.85%  +8.69%  2  3  +  C++  10.64%  +0.29%  3  4  +  Java  9.60%  +1.26%  4 ...

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...