Go by Example - IT: Goroutine

Una goroutine è di fatto un green thread che permette di rendere concorrente l’esecuzione del nostro programma.

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

Supponiamo di avere una chiamata di funzione f(s). Questo è il modo classico di invocarla, che la eseguirà in modo sincrono.

    f("direct")

Per invocare questa funzione in una goroutine, utilizza go f(s). Questa nuova goroutine eseguirà in parallelo alla goroutine dove è stata invocata.

    go f("goroutine")

È possibile far partire una goroutine anche con una funzione anonima.

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

Le nostre due chiamte di funzione stanno eseguendo in modo asincrono, su due goroutine separate. La funzione Scanln richiede che si prema un tasto, prima di far terminare l’esecuzione della goroutine principale (che terminerà tutte le altre goroutine).

    var input string
    fmt.Scanln(&input)
    fmt.Println("done")
}

Quando si esegue questo programma si può notare prima l’output delle chiamate bloccanti. Successivamente si nota come le due goroutine lanciate producano dell’output “disordinato”. Questo disordine riflette l’esecuzione concorrente delle goroutine da parte del runtime di Go.

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

Adesso siamo pronti per analizzare la struttura complementare alle goroutine in Go: i channel.

Prossimo esempio: Channel.