Heim  >  Artikel  >  Backend-Entwicklung  >  Warum stoßen Go-Programme auf den „schwerwiegenden Fehler: Alle Goroutinen schlafen – Deadlock!“ und wie kann er behoben werden?

Warum stoßen Go-Programme auf den „schwerwiegenden Fehler: Alle Goroutinen schlafen – Deadlock!“ und wie kann er behoben werden?

Patricia Arquette
Patricia ArquetteOriginal
2024-11-17 02:23:03160Durchsuche

Why do Go programs encounter the

Go: Deadlock-Panik – Ursache verstehen und beheben

In Go ist ein häufiger Fehler „Schwerwiegender Fehler: Alle Goroutinen sind betroffen.“ eingeschlafen - Stillstand!“ beim Versuch, die Kommunikation zwischen Goroutinen zu verwalten. Dieser Fehler tritt auf, wenn Goroutinen in einem Zustand stecken bleiben, in dem sie alle darauf warten, dass der andere fortfährt.

Problemstellung

Bedenken Sie den folgenden Code, den Sie lesen möchten eine Zeile mit Wörtern aus einer Textdatei, speichern Sie sie in einem Kanal und drucken Sie sie dann einzeln aus:

func main() {
    f, _ := os.Open("D:\input1.txt")
    scanner := bufio.NewScanner(f)
    file1chan := make(chan string)
    for scanner.Scan() {
        line := scanner.Text()
        parts := strings.Fields(line)
        for i := range parts {
            file1chan <- parts[i]
        }
    }
    print(file1chan)
}

func print(in <-chan string) {
    for str := range in {
        fmt.Printf("%s\n", str)
    }
}

Ursache des Deadlocks

Beim Ausführen dieses Codes , tritt der Deadlock-Fehler auf. Dies liegt daran, dass der Kanal file1chan ungepuffert ist. Wenn Sie also versuchen, einen Wert an den Kanal zu senden, blockiert dieser auf unbestimmte Zeit und wartet auf einen Empfänger.

Deadlock beheben

Um den Deadlock aufzulösen, Sie haben zwei Möglichkeiten:

  1. Verwenden Sie einen gepufferten Kanal:
    Sie können einen gepufferten Kanal erstellen, indem Sie seine Größe als zweites Argument für make(chan) angeben. , etwa so:

    file1chan := make(chan string, 1) // buffer size of one

    Ein gepufferter Kanal verhält sich wie ein Array, in dem der Absender Werte ohne Blockierung senden kann, wenn der Kanal über verfügbare Kapazität verfügt.

  2. Verwenden Sie eine neue Goroutine:
    Sie können eine neue Goroutine starten, um Werte an den ungepufferten Kanal zu senden:

    file1chan := make(chan string)
    go func() { // start a new goroutine that sends strings down file1chan
        for scanner.Scan() {
            line := scanner.Text()
            parts := strings.Fields(line)
            for i := range parts {
                file1chan <- parts[i]
            }
        }
        close(file1chan)
    }()
    
    print(file1chan)

    Mit diesem Ansatz übernimmt die neue Goroutine die Verantwortung für das Senden von Werten, während Die Haupt-Goroutine konzentriert sich auf das Drucken.

Durch die Implementierung einer dieser Lösungen beseitigen Sie effektiv den Stillstand und ermöglichen eine reibungslose Kommunikation zwischen Ihren Goroutinen.

Das obige ist der detaillierte Inhalt vonWarum stoßen Go-Programme auf den „schwerwiegenden Fehler: Alle Goroutinen schlafen – Deadlock!“ und wie kann er behoben werden?. 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