Sto lavorando su una libreria concorrente Go, e sono incappato in due modelli distinti di sincronizzazione tra goroutines i cui risultati sono simili:Qual è il vantaggio di sync.WaitGroup su Canali?
Utilizzando Waitgroup
var wg sync.WaitGroup
func main() {
words := []string{ "foo", "bar", "baz" }
for _, word := range words {
wg.Add(1)
go func(word string) {
time.Sleep(1 * time.Second)
defer wg.Done()
fmt.Println(word)
}(word)
}
// do concurrent things here
// blocks/waits for waitgroup
wg.Wait()
}
utilizzando il canale
func main() {
words = []string{ "foo", "bar", "baz" }
done := make(chan bool)
defer close(done)
for _, word := range words {
go func(word string) {
time.Sleep(1 * time.Second)
fmt.Println(word)
done <- true
}(word)
}
// Do concurrent things here
// This blocks and waits for signal from channel
<-done
}
Sono stato avvisato che sync.WaitGroup
è leggermente più performante, e io h avendolo visto comunemente. Tuttavia, trovo i canali più idiomatici. Qual è il vero vantaggio dell'uso di sync.WaitGroup
sui canali e/o quale potrebbe essere la situazione quando è meglio?
Nel secondo esempio, la sincronizzazione è errata. blocchi fino a quando la prima goroutine non manda sul canale, non fino all'ultimo. –
Dai un'occhiata a: https://github.com/golang/go/wiki/MutexOrChannel#wait-group – molivier
@Not_a_Golfer per qualche motivo quando ho cambiato l'argomento nella funzione della goroutine su 'word' stampa tutti i membri correttamente. – PieOhPah