Heim >Backend-Entwicklung >Golang >So lösen Sie Go-Parallelitäts-Deadlocks: „Alle Goroutinen schlafen'?

So lösen Sie Go-Parallelitäts-Deadlocks: „Alle Goroutinen schlafen'?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-12-28 13:31:13857Durchsuche

How to Resolve Go Concurrency Deadlocks:

Deadlock-Fehler in der Parallelität: „throw: All Goroutines Are Asleep“

Beim Arbeiten mit Parallelität in Go kann es zu einem Deadlock kommen, wenn alle Goroutinen warten darauf, dass einander eine Aktion ausführt. Ein häufiger Fehler im Zusammenhang mit diesem Problem ist „Throw: Alle Goroutinen schlafen – Deadlock!“

Das Problem verstehen

Betrachten Sie das folgende Go-Programm:

package main

import (
    "fmt"
)

func total(ch chan int) {
    res := 0
    for iter := range ch {
        res += iter
    }
    ch <- res
}

func main() {
    ch := make(chan int)
    go total(ch)
    ch <- 1
    ch <- 2
    ch <- 3
    fmt.Println("Total is ", <-ch)
}

Beim Ausführen dieses Programms tritt die Fehlermeldung „throw: all goroutines are schlafend – Deadlock!“ auf. Der Grund dafür ist, dass die Bereichsschleife in der Gesamtfunktion niemals beendet wird, da wir den Kanal ch nie schließen. Infolgedessen wird die Goroutine, die in der Hauptfunktion auf den Empfang des Ergebnisses wartet, dieses niemals erhalten.

Auflösen des Deadlocks

Um diesen Deadlock aufzulösen, müssen wir schließen den ch-Kanal, um anzuzeigen, dass keine weiteren Werte gesendet werden. Darüber hinaus können wir einen separaten Kanal verwenden, um das Ergebnis zurückzusenden, wodurch ein direktes Senden und Empfangen auf demselben Kanal verhindert wird.

Das überarbeitete Programm unten behebt diese Probleme:

package main

import (
    "fmt"
)

func total(in chan int, out chan int) {
    res := 0
    for iter := range in {
        res += iter
    }
    out <- res // sends back the result
}

func main() {
    ch := make(chan int)
    rch := make(chan int)
    go total(ch, rch)
    ch <- 1
    ch <- 2
    ch <- 3
    close(ch) // this will end the loop in the total function
    result := <-rch // waits for total to give the result
    fmt.Println("Total is ", result)
}

Durch Schließen Durch die Verwendung des CH-Kanals und der Verwendung eines separaten RCH-Kanals für das Ergebnis beseitigen wir den Deadlock und ermöglichen die korrekte Ausführung des Programms.

Das obige ist der detaillierte Inhalt vonSo lösen Sie Go-Parallelitäts-Deadlocks: „Alle Goroutinen schlafen'?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn