Heim > Backend-Entwicklung > Golang > Warum blockiert eine Infinite-Go-Routine das Senden anderer Goroutinen an Kanäle?

Warum blockiert eine Infinite-Go-Routine das Senden anderer Goroutinen an Kanäle?

Linda Hamilton
Freigeben: 2024-12-04 16:52:11
Original
604 Leute haben es durchsucht

Why Does an Infinite Go Routine Block Other Goroutines from Sending to Channels?

Go-Routine blockiert andere: Eine tiefere Erklärung

In Go zeigt der folgende Code ein ungewöhnliches Verhalten, bei dem eine Goroutine scheinbar eine Endlosschleife hat verhindert, dass die Nachricht einer anderen Goroutine den vorgesehenen Kanal erreicht:

func main() {
   timeout := make(chan int)
   go func() {
      time.Sleep(time.Second)
      timeout <- 1
    }()

    res := make(chan int)
    go func() {
        for {
        }
        res <- 1
    }()
    select {
        case <-timeout:
            fmt.Println("timeout")
        case <-res:
            fmt.Println("res")
    }
}
Nach dem Login kopieren

Anstatt das Programm nach einer Sekunde zu beenden gelangt in eine Endlosschleife. Warum passiert das?

Kooperative Planung in Go verstehen

Die Antwort liegt in Gos Verwendung der kooperativen Planung für Goroutinen. Goroutinen geben unter bestimmten Bedingungen die Kontrolle an den Scheduler ab, einschließlich:

  • Ungepufferte Kanal-Sende-/Empfangsvorgänge
  • Systemaufrufe (z. B. Datei-/Netzwerk-E/A)
  • Speicherzuweisung
  • time.Sleep() Aufrufe
  • runtime.Gosched()-Aufrufe

Da die Endlosschleife in der ersten Goroutine niemals nachgibt, verhindert sie, dass andere Goroutinen ausgeführt werden und Nachrichten an Kanäle senden. Dazu gehört auch der Timeout-Kanal, der auf eine Nachricht wartet, die nie ankommt.

Mögliche Lösungen

Obwohl kooperative Planung zu solchen Situationen führen kann, gibt es mögliche Lösungen :

  • Erhöhung von GOMAXPROCS: Diese Umgebungsvariable ermöglicht die Ausführung mehrerer Threads Goroutinen gleichzeitig ausführen, wodurch die Wahrscheinlichkeit verringert wird, dass eine Goroutine andere blockiert.
  • Verwendung eines präventiven Schedulers (zukünftiges Ziel): Go-Sprachentwickler zielen darauf ab, einen präemptiven Scheduler zu implementieren, der zwangsweise zwischen Goroutinen wechseln würde, Eliminierung des Problems der Blockierung.
  • Manuelle Ausbeute: Die Mit der runtime.Gosched()-Funktion können Goroutinen die Kontrolle manuell an den Scheduler übergeben und so aus Endlosschleifen ausbrechen, die andere blockieren könnten.

Das obige ist der detaillierte Inhalt vonWarum blockiert eine Infinite-Go-Routine das Senden anderer Goroutinen an Kanäle?. 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