„Wenn ein Arbeiter seine Arbeit gut machen will, muss er zuerst seine Werkzeuge schärfen.“ – Konfuzius, „Die Gespräche des Konfuzius. Lu Linggong“
Titelseite > Programmierung > Wie kann ein Deadlock in der Go-Parallelität mit sync.WaitGroup verhindert werden?

Wie kann ein Deadlock in der Go-Parallelität mit sync.WaitGroup verhindert werden?

Veröffentlicht am 02.11.2024
Durchsuche:953

How to Prevent Deadlock in Go Concurrency with sync.WaitGroup?

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.

Neuestes Tutorial Mehr>

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