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

Rocket: un framework web para Rust

Rocket Framework es: Un framework web escrito en Rust.   Inspirado en Rails, Flask, Bottle y Yesod.  Admite el manejo de solicitudes HTTP, Web Sockets, JSON, plantillas y más. Creando un proyecto con Rocket Framework En primer lugar, verificamos la instalación de Rust en nuestras máquinas: rustc - - version Continuamos con la configuración de Rust nightly como nuestra cadena de herramientas predeterminada ejecutando el comando: rustup default nightly Si lo prefieres, una vez que configuremos un directorio de proyecto en la siguiente sección, puedes usar anulaciones por directorio para usar la versión nocturna solo para tu proyecto Rocket ejecutando el siguiente comando en el directorio: rustup override set nightly Creamos nuevo proyecto `` hola-rocket `` y nos ubicamos en el directorio creado: cargo new hola - rocket - - bin cd hola - rocket Con Cargo, agregamos la dependencia de rocket: cargo add rocket Abrimos el archivo `` Cargo.toml `` Ca...

Odin language: el lenguaje de programación orientado a datos para un desarrollo de software sensato

En esta serie sobre lenguajes de programación hablamos de Odin , un lenguaje orientado a datos. Un nuevo lenguaje de programación que nos podrá recordar a lenguajes como C++, Python, Golang o hasta Rust. Instalación (Windows): 1 2 3 4 $ git clone https://github.com/odin-lang/Odin $ cd Odin $ git pull $ build.bat release Debemos asegurarnos de crear la variable de entorno: Nombre: ODIN_HOME Valor: C:\Users\HP\Documents\pruebasOdin\Odin Ejemplo 1. Como primer programa tendremos al clásico "Hola, mundo". holamundo.odin package holamundo import " core:fmt " main : : proc ( ) { fmt . println ( " ¡Hola, mundo desde Odin! " ) } Construimos: $ odin build holamundo . odin - file Ejecutamos: $ holamundo .exe Recordar que si usamos Visual Studio Code podemos instalar el plugin de Odin Language: https://marketplace.visualstudio.com/items?itemName=DanielGavin.ols Ejemplo 2. Programa que muestre las variables que pod...

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