Ich arbeite an einer gleichzeitigen Go-Bibliothek, und ich stolperte über zwei verschiedene Muster der Synchronisation zwischen goroutines deren Ergebnisse sind ähnlich:Was ist der Vorteil von sync.WaitGroup über Kanäle?
Waitgroup Mit
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()
}
Kanal Mit
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
}
ich wurde darauf hingewiesen, dass sync.WaitGroup
etwas mehr performant ist, und ich h Ich habe gesehen, dass es häufig verwendet wird. Allerdings finde ich Kanäle idiomatischer. Was ist der wirkliche Vorteil der Verwendung von sync.WaitGroup
über Kanäle und/oder was könnte die Situation sein, wenn es besser ist?
In Ihrem zweiten Beispiel ist die Synchronisierung falsch. du blockierst, bis die erste goroutine auf dem Kanal sendet, nicht bis zum letzten. –
Werfen Sie einen Blick auf: https://github.com/golang/go/wiki/MutexOrChannel#wait-group – molivier
@Not_a_Golfer aus irgendeinem Grund, wenn ich das Argument in der Goroutine-Funktion zu "Wort" geändert hat, druckt es alle Mitglieder aus korrekt. – PieOhPah