Sincronizzazione Dei Channel
#
// Possiamo usare i channel per sincronizzare l'esecuzione
// attraverso delle goroutine. Di seguito un esempio dove
// usiamo un ricevimento bloccante per aspettare che una
// goroutine termini il suo lavoro.
package main
import "fmt"
import "time"
// Questa è la funzione che eseguiremo in una goroutine.
// Il canale `fatto` verrà usato per dire a un'altra
// goroutine che ha finito il suo lavoro.
func worker(fatto chan bool) {
fmt.Print("sto lavorando...")
time.Sleep(time.Second)
fmt.Println("fatto")
// Inviamo un valore per dire che abbiamo finito il
// nostro lavoro.
fatto <- true
}
func main() {
// Iniziamo una goroutine lavoratrice, dandole un
// canale da notificare una volta che ha svolto
// il suo lavoro.
done := make(chan bool, 1)
go worker(done)
// Blocchiamo l'esecuzione finché non abbiamo ricevuto
// una notifica sul canale dalla goroutine lavoratrice.
<-done
}
$ go run channel-synchronization.go
sto lavorando...fatto
# Se rimuovessi la linea `<- done` da questo programma,
# allora quest'ultimo sarebbe terminato addirittura prima
# che la goroutine lavoratrice fosse avviata.