🥇 Gorutinas

Go provee gorutina como una forma de manejar multiples 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 continue.

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 despues de imprimir la unica 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.

Funciones y bloqueo. Utilizando multiples rutinas.
comments powered by Disqus