Ich versuche, dieses Problem auf Exercism zu lösen:Ärger mit goroutines in einer for-Schleife
Write a program that counts the frequency of letters in texts using parallel computation.
Grundsätzlich habe ich einen FreqMap
Typ:
type FreqMap map[rune]int
Und eine Frequency
Funktion:
func Frequency(s string) FreqMap {
m := make(FreqMap)
for _, v := range s {
m[v]++
}
return m
}
Exercism stellt ein Beispiel dar, das eine gleichzeitige Version implementiert Verwenden von Rekursion, aber ich möchte meine eigene Version mit einer for
Schleife implementieren. Ich kam mit der folgenden Lösung auf, die nicht funktioniert:
func ConcurrentFrequency(l []string) FreqMap {
c := make(chan FreqMap)
for i := 0; i < len(l); i++ {
go func(i int) {
c <- Frequency(l[i])
}(i)
}
return <- c
}
Dies scheint zurückzukehren, c
das Ergebnis von nur 1 goroutine zu enthalten scheint; Ich bekomme das gleiche Ergebnis, wenn ich eine sync.WaitGroup
hinzufüge.
Könnten Sie mir bitte erklären, was mir hier fehlt?
Vielen Dank im Voraus für Ihre Hilfe!
Vielen Dank, das scheint mein Problem zu lösen! Könntest du mir bitte erklären, warum wir die erste Gorotine brauchten, die auch die 'for'-Schleife einwickelte? Wenn ich es entferne, gibt es einen "fatalen Fehler: alle Goroutines schlafen - Deadlock!", Aber ich sehe den Grund nicht. Danke noch einmal! –
Nicht sicher, wie Sie den Code geändert haben, aber ich bezweifle, dass es bei der wg.Wait Deadlocks - die Verbraucherschleife wird dann nicht erreicht werden, da der Code dort stecken würde. Ich habe die WaitGroup verwendet, damit der Kanal geschlossen werden kann, wenn alle 'Frequency'-Aufrufe zurückkommen. Das ist das übliche Muster, wenn Sie den Kanal zurückgeben. – ain
Also, wenn es keine Goroutine Schließung der ersten Ebene gibt, 'wg.Wait()' Timeouts den Rest? Mein Vorteil ist, dass 'wg.Done()' den WaitGroup-Zähler dekrementiert, sobald die Schließung der Goroutine in der 'for'loop-Schleife zurückkehrt; Warum gibt es dann einen Deadlock wenn 'wg.Wait() 'wird in der' ConcurrentFrequency() '- Ebene und nicht in einer verschachtelten Goroutine platziert? Entschuldige, dass ich dich noch einmal belästige, versuche nur das meiste davon zu verstehen und dein Feedback wird sehr geschätzt! –