Heim > Backend-Entwicklung > Golang > Go Deadlocks: Wie vermeide ich den Fehler „Alle Goroutinen schlafen'?

Go Deadlocks: Wie vermeide ich den Fehler „Alle Goroutinen schlafen'?

Linda Hamilton
Freigeben: 2024-12-27 13:06:18
Original
836 Leute haben es durchsucht

Go Deadlocks: How to Avoid the

Deadlock in Go: „Throw: Alle Goroutinen schlafen“

Ein Goroutine-Deadlock tritt auf, wenn alle laufenden Goroutinen aufeinander warten vollständig. Im bereitgestellten Go-Code entsteht ein Deadlock aufgrund des nicht geschlossenen Kanals ch.

Die Gesamtfunktion wartet mithilfe einer Bereichsschleife kontinuierlich auf neue Werte auf dem Kanal ch. Da der ch-Kanal niemals geschlossen wird, wird die Schleife niemals beendet. Dies bedeutet, dass die Goroutine, die für die Ausführung dieser Funktion verantwortlich ist, niemals beendet wird.

Währenddessen versucht das Programm in der Hauptfunktion, Werte an den Kanal ch zu senden und das Ergebnis zu empfangen. Da die gesamte Goroutine jedoch auf unbestimmte Zeit wartet, kann sie die gesendeten Werte nicht verarbeiten und das Ergebnis nicht zurücksenden. Dies führt zu einem Deadlock des Programms.

Um diesen Deadlock zu beheben, muss der Kanal nach dem Senden aller Werte geschlossen werden. Dies signalisiert der Summenfunktion, nicht mehr auf neue Werte zu warten und das Ergebnis zu berechnen.

Hier ist eine modifizierte Version des Codes mit der Kanalschließung:

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

Nun die laufende Summe der Goroutine führt die Summierung korrekt durch und sendet das Ergebnis zurück an main, wodurch ein Deadlock verhindert wird.

Das obige ist der detaillierte Inhalt vonGo Deadlocks: Wie vermeide ich den Fehler „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