Goroutines

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