Programación asíncrona en Go: guía completa para principiantes

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

Programación asíncrona en Go: guía completa para principiantes

\n\n

La programación asíncrona es un enfoque en el que un programa puede ejecutar múltiples tareas simultáneamente sin bloquear la ejecución del hilo principal. En el lenguaje Go (Golang), este mecanismo se implementa de manera especialmente elegante y simple gracias a los primitivos integrados: gorutinas (goroutines) y canales (channels). A diferencia de muchos otros lenguajes, donde la asincronía requiere complejos callbacks o promesas, Go ofrece una sintaxis concisa y potentes herramientas para trabajar con concurrencia.

\n\n

En esta guía, analizaremos los fundamentos de la programación asíncrona en Go. Aprenderá qué son las gorutinas, cómo crearlas y sincronizarlas usando canales, y cómo usar el operador select para trabajar con múltiples canales. El material está diseñado para principiantes, por lo que todos los ejemplos serán lo más simples y claros posible.

\n\n

¿Qué son las gorutinas y cómo funcionan?

\n\n

Una gorutina (goroutine) es un hilo de ejecución ligero gestionado por el runtime de Go. A diferencia de los hilos normales del sistema operativo, las gorutinas consumen muchos menos recursos: la pila de una gorutina comienza con unos pocos kilobytes y puede expandirse dinámicamente. Puede iniciar una gorutina simplemente agregando la palabra clave go antes de una llamada a función:

\n\n
package main\n\nimport (\n    "fmt"\n    "time"\n)\n\nfunc printMessage(msg string) {\n    for i := 0; i < 3; i++ {\n        fmt.Println(msg)\n        time.Sleep(100 * time.Millisecond)\n    }\n}\n\nfunc main() {\n    // Iniciamos una gorutina\n    go printMessage("¡Hola desde la gorutina!")\n    \n    // Función principal\n    printMessage("¡Hola desde main!")\n    \n    // Esperamos a que termine la gorutina\n    time.Sleep(1 * time.Second)\n}
\n\n

En este ejemplo, la función printMessage se ejecuta dos veces: una como función normal y otra como gorutina. La ejecución ocurre de manera concurrente: los mensajes se mezclarán. Tenga en cuenta: sin time.Sleep al final de main, el programa finalizaría sin esperar a que la gorutina termine. Para una sincronización confiable, es mejor usar mecanismos especiales.

\n\n

Canales: transferencia segura de datos entre gorutinas

\n\n

Los canales (channels) son "tuberías" tipificadas a través de las cuales las gorutinas pueden intercambiar datos. Un canal se crea con la función make y el operador chan. Los datos se envían al canal mediante <- y se reciben de él con una sintaxis similar.

\n\n

Veamos un ejemplo básico:

\n\n
package main\n\nimport "fmt"\n\nfunc sendData(ch chan string) {\n    ch <- "Datos desde la gorutina"\n}\n\nfunc main() {\n    // Creamos un canal para cadenas\n    messageChannel := make(chan string)\n    \n    // Iniciamos una gorutina que envía datos\n    go sendData(messageChannel)\n    \n    // Recibimos datos del canal (se bloquea hasta recibir)\n    message := <-messageChannel\n    \n    fmt.Println(message)\n}
\n\n

Aquí, la gorutina envía una cadena al canal, y main espera a recibirla. Importante: las operaciones con canales son bloqueantes por defecto. El envío a un canal se bloquea hasta que los datos se reciben, y viceversa. Esto proporciona una sincronización natural.

\n\n

Los canales pueden ser amortiguados (buffered). El búfer permite enviar datos sin bloqueo hasta que el búfer se llene:

\n\n
// Creamos un canal amortiguado de 2 elementos\nbufferedChannel := make(chan string, 2)\n\n// Enviamos datos sin bloqueo\nbufferedChannel <- "Primero"\nbufferedChannel <- "Segundo"\n\n// Ahora podemos recibir los datos\nfmt.Println(<-bufferedChannel)\nfmt.Println(<-bufferedChannel)
\n\n

El operador select: trabajando con múltiples canales

\n\n

Cuando tiene varios canales y desea reaccionar al que

Blogs

Book Recommendations