Go by Example: Goroutines

Una goroutine es un hilo de ejecución ligero.

package main
import (
    "fmt"
    "time"
)
func f(from string) {
    for i := 0; i < 3; i++ {
        fmt.Println(from, ":", i)
    }
}
func main() {

Supongamos que tenemos una llamada a la función f(s). Así es como la llamaríamos de la manera habitual, ejecutándola sincrónicamente.

    f("direct")

Para invocar esta función en una goroutine, usa go f(s). Esta nueva goroutine se ejecutará concurrentemente con la que la llama.

    go f("goroutine")

También puedes iniciar una goroutine para una llamada a una función anónima.

    go func(msg string) {
        fmt.Println(msg)
    }("going")

Nuestras dos llamadas a funciones están corriendo de manera asincrónica en goroutines separadas ahora. Espera a que terminen (para un enfoque más robusto, utiliza un WaitGroup).

    time.Sleep(time.Second)
    fmt.Println("done")
}

Cuando ejecutamos este programa, vemos la salida de la llamada bloqueante primero, luego la salida de las dos goroutines. La salida de las goroutines puede estar entrelazada, ya que las goroutines se ejecutan concurrentemente por el runtime de Go.

$ go run goroutines.go
direct : 0
direct : 1
direct : 2
goroutine : 0
going
goroutine : 1
goroutine : 2
done

A continuación, veremos un complemento para las goroutines en programas concurrentes de Go: los canales.

Siguiente ejemplo: Channels.