Goroutine
Una función de Go que se ejecuta de forma concurrente con el resto del programa; es muy ligera y se lanza escribiendo go delante de la llamada.
Las goroutines las gestiona el propio entorno de Go, que las reparte entre unos pocos hilos del sistema. Ocupan muy poca memoria, así que un programa puede tener miles a la vez.
Se comunican con canales (chan): una envía un valor y otra lo recibe, lo que evita compartir variables sin protección.
Un ejemplo
go descargar(url) empieza a descargar en segundo plano mientras el programa sigue con lo siguiente.
Por qué importa
Las goroutines son la herramienta de concurrencia de Go y una de las razones de su popularidad en servidores y servicios en red. Se lanzan simplemente escribiendo go delante de una llamada a función, y son tan ligeras que un programa puede tener decenas de miles activas sin problema, algo inviable con hilos del sistema operativo tradicionales.
Suelen combinarse con canales, que sirven para que las goroutines se envíen datos entre sí. La filosofía de Go es compartir memoria comunicándose, en lugar de comunicarse compartiendo memoria. Entender esto te permite escribir programas concurrentes más seguros.
Confusiones frecuentes
Una goroutine no es un hilo del sistema operativo: es gestionada por el entorno de ejecución de Go, que las reparte entre unos pocos hilos reales. El error más típico del principiante es que main termine antes que sus goroutines: al acabar main, el programa se cierra aunque queden goroutines en marcha y no verás su salida. Hay que esperarlas con sync.WaitGroup o con canales. Y lanzar muchas goroutines que escriben en la misma variable sin protección provoca condiciones de carrera.
Preguntas frecuentes
¿Cómo espero a que terminen mis goroutines?
Con sync.WaitGroup: llamas a Add antes de lanzarlas, Done al terminar cada una y Wait donde quieras esperar a todas.
¿Cómo detecto condiciones de carrera?
Ejecutando el programa o las pruebas con la bandera -race, por ejemplo go run -race main.go.
Fuentes consultadas
- A Tour of Go: Goroutines (go.dev)