Heim > Backend-Entwicklung > Golang > Go Deadlock: Warum passiert „werfen: Alle Goroutinen schlafen'?

Go Deadlock: Warum passiert „werfen: Alle Goroutinen schlafen'?

Mary-Kate Olsen
Freigeben: 2025-01-02 15:03:39
Original
558 Leute haben es durchsucht

Go Deadlock: Why Does

Deadlock in Go: „Throw: Alle Goroutinen schlafen“

In einem Go-Programm tritt ein Deadlock auf, wenn zwei oder mehr Goroutinen warten dass der andere fertig wird, was zu einem eingefrorenen Zustand führt, in dem kein Fortschritt erzielt werden kann. Dieses Problem wird oft als „Throw: Alle Goroutinen schlafen – Deadlock“ gemeldet.

Lassen Sie uns ein vereinfachtes Go-Programm analysieren, um zu verstehen, warum dieser Deadlock auftritt:

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)
}
Nach dem Login kopieren

In diesem Programm ist die Die Gesamtfunktion berechnet die Summe der über den Kanal gesendeten Zahlen und sendet das Ergebnis auf demselben Kanal zurück. Der Deadlock entsteht, weil die folgenden Bedingungen erfüllt sind:

  • Die gesamten Funktionsblöcke innerhalb der for-Schleife warten auf weitere Eingaben über ch (mit dem Schlüsselwort „range“).
  • Die Hauptfunktion sendet Drei Werte an ch, aber der Kanal wird nicht geschlossen.
  • Da die Gesamtfunktion immer noch auf weitere Eingaben wartet, sendet sie das Ergebnis nicht zurück ch.
  • Die Hauptfunktionsblöcke in der Zeile fmt.Println warten auf das Ergebnis von ch.

Dies führt zu einer Deadlock-Situation, in der beide Goroutinen (die eine mit laufender Summe und die eine in main) warten darauf, dass der andere reagiert, was zum Fehler „Throw: Alle Goroutinen schlafen“ führt.

Um diesen Deadlock zu beheben, können wir die schließen ch-Kanal in der Hauptfunktion nach dem Senden des letzten Werts:

ch <- 3
close(ch)
Nach dem Login kopieren

Das Schließen des Kanals signalisiert der gesamten Goroutine, dass keine Eingabe mehr erfolgt, sodass sie ihre Berechnung abschließen und das Ergebnis an ch zurücksenden kann.

Das obige ist der detaillierte Inhalt vonGo Deadlock: Warum passiert „werfen: Alle Goroutinen schlafen'?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage