Go by Example - IT: 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.

Prossimo esempio: Direzioni Dei Channel.