Synchronisation DES Canaux

Synchronisation des canaux #

// On peut utiliser les canaux pour synchronier
// l'exécution à travers des goroutines. Voici un exemple
// qui utilise une réception bloquante pour attendre
// qu'une goroutine se termine.

package main

import "fmt"
import "time"

// Voici la fonction qui va tourner dans une goroutine.
// Le canal `done` sera utilisé pour notifier une autre
// goroutine que le travail de cette fonction est terminé
func worker(done chan bool) {
    fmt.Print("working...")
    time.Sleep(time.Second)
    fmt.Println("done")

    // Envoie une valeur pour notifier qu'on a terminé.
    done <- true
}

func main() {
    // On démarre la goroutine, en lui fournissant
    // le canal à notifier.
    done := make(chan bool, 1)
    go worker(done)

    // On bloque jusqu'à ce qu'on ait reçu une
    // notification sur ce canal.
    <-done
}
$ go run channel-synchronization.go      
working...done                  

# Si vous enlevez la ligne `<- done`, le programme se
# terminerait avant que `worker` ait même commencé.