¿Qué son las gorutinas?
Go provee gorutina como una forma de manejar múltiples procesos de forma concurrente. En el ejemplo anterior la función leerArchivo()
realiza un bloqueo de 5 segundos, si lo colocamos dentro de una gorutina podemos evitar dicho bloqueo y permitir que la ejecución del programa continué.
package main
import (
"fmt"
"time"
)
func leerArchivo() string {
time.Sleep(time.Second * 5)
return "Datos del archivo"
}
func main() {
go func() {
datos := leerArchivo()
fmt.Println(datos)
}()
fmt.Println("Continuar con la ejecución")
}
Sin embargo al ejecutar el bloque anterior, tenemos el siguiente problema. El código si bien esta dentro de una gorutina, esta gorutina toma 5 segundos en completarse. Go continua la ejecución del programa, y termina dicha ejecución al llegar al final del código, justo después de imprimir la única salida reportada.
Continuar con la ejecución
Si por el contrario realizamos una modificación al script para permitir que el primer proceso se complete, podremos observar la salida de forma correcta.
package main
import (
"fmt"
"time"
)
func leerArchivo() string {
time.Sleep(time.Second * 5)
return "Datos del archivo"
}
func main() {
go func() {
datos := leerArchivo()
fmt.Println(datos)
}()
fmt.Println("Continuar con la ejecución")
time.Sleep(time.Second * 10)
}
Ahora tendremos…
Continuar con la ejecución
Datos del archivo
Todas las gorutinas deben tener el tiempo suficiente para poder completarse. Si se alcanza el final del script o se cierra la ejecución manualmente, las rutinas en proceso también se cancelaran.