Le Go par l'exemple: Goroutines

Une goroutine est un thread d’exécution léger.

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

Suppons que l’on ait un appel de fonction f(s). Normalement, on l’appellerait comme ceci, et son execution serait synchrone.

    f("direct")

Pour appeler la fonction dans une goroutine, on utilise go f(s). Cette nouvelle goroutine va s’exécuter de manière concurrent avec l’appellée.

    go f("goroutine")

On peut aussi démarrer une goroutine pour un appel de fonction anonyme.

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

Nous deux appels de fonction s’éxécutent de manière asynchrone dans des goroutines séparées, donc l’exécution tombe ici. Ce Scanln demande que l’on presse une touche pour sortir du programme.

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

Lorsque l’on lance ce programme, on voit la sortie de la fonction bloquante en premier, puis les exécutions croisées des deux goroutines. Cet entrelacement reflète le fait que les deux goroutines sont exécutées de manière concurrente.

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

Ensuite nous allons regarder un complément aux goroutines : les channels

Exemple suivant: Canaux.