Goroutinen-Deadlock lösen
In diesem Szenario ist in Ihrem Go-Parallelitätscode ein Deadlock-Fehler aufgetreten. Lassen Sie uns das Problem untersuchen und eine effiziente Lösung anbieten.
Der Fehler tritt aufgrund der Diskrepanz zwischen dem Verhalten Ihrer Produzenten und Ihres Konsumenten auf. Ihre in der Produzentenfunktion implementierten Produzenten senden für eine begrenzte Dauer Werte auf dem Kanal ch. Der in Ihrer Hauptfunktion vorhandene Verbraucher läuft jedoch unbegrenzt und versucht endlos, Werte von ch zu empfangen.
Um diesen Deadlock zu beheben, müssen Sie sicherstellen, dass der Verbraucher die Fertigstellung der Produzenten respektiert. Dies bedeutet, dass der Verbraucher automatisch beendet werden sollte, wenn die Produzenten mit dem Senden von Werten fertig sind.
Ein effektiver Ansatz besteht darin, eine sync.WaitGroup zu verwenden, um die Produzenten zu koordinieren. Mit der Wartegruppe können Sie den Fortschritt der Produzenten verfolgen und warten, bis sie ihre Aufgaben abgeschlossen haben, bevor Sie den Kanal schließen. Hier ist eine verbesserte Version Ihres Codes:
func main() {
var wg sync.WaitGroup
ch := make(chan int)
wg.Add(1)
go producer(ch, 100*time.Millisecond, 2, &wg)
wg.Add(1)
go producer(ch, 200*time.Millisecond, 5, &wg)
// Start a goroutine to close the channel when all producers are done
go func() {
wg.Wait()
close(ch)
}()
// Use a for range loop to receive values from the channel
for v := range ch {
fmt.Println(v)
}
}
In diesem aktualisierten Code wird die sync.WaitGroup verwendet, um die Anzahl der aktiven Produzenten zu verfolgen. Die Produzenten rufen wg.Done() auf, um die Wartegruppe zu dekrementieren, wenn sie mit dem Senden von Werten fertig sind. Die Haupt-Goroutine wartet mit wg.Wait() darauf, dass alle Produzenten fertig sind, und schließt dann den CH-Kanal.
Durch die Verwendung einer sync.WaitGroup richten Sie einen Koordinierungsmechanismus ein, der es Ihrem Verbraucher ermöglicht, den Abschlussstatus zu respektieren der Produzenten, wodurch der Deadlock-Fehler effektiv behoben wird.
Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.
Copyright© 2022 湘ICP备2022001581号-3