Goroutine-Timeout-Kanal nie aufgerufen
Bei der Verwendung von Goroutinen und Kanälen in Go ist es wichtig zu verstehen, wie Timeouts funktionieren. In diesem Codeausschnitt besteht das Ziel darin, „TIMEOUT“ nach 2 Sekunden auszugeben, wenn auf dem Kanal c1 kein Wert empfangen wird. Der Timeout-Fall wird jedoch nie ausgeführt.
Erklärung:
Das Problem liegt in der Art und Weise, wie der Timeout-Kanal innerhalb der Auswahlschleife erstellt wird. Jedes Mal, wenn ein Wert von c1 empfangen wird, wird mit time.After(...) ein neuer Timeout-Kanal erstellt. Dadurch wird die vorherige Zeitüberschreitung effektiv aufgehoben und eine neue gestartet. Solange c1 weiterhin Werte empfängt, wird der Timeout-Kanal ständig zurückgesetzt und erreicht nie seinen 2-Sekunden-Ablauf.
Lösung:
Um sicherzustellen, dass das Timeout ausgelöst wird Verschieben Sie die Erstellung des Timeout-Kanals wie beabsichtigt außerhalb der Auswahlschleife. Durch die einmalige Erstellung bleibt der Kanal aktiv, bis sein Ablauf erreicht ist, unabhängig von den von c1 empfangenen Werten.
Geänderter Code:
func main() { c1 := make(chan int, 1) timeout := time.After(2000 * time.Millisecond) go func() { for { time.Sleep(1500 * time.Millisecond) c1 <- 10 } }() for { select { case i := <-c1: fmt.Println(i) case <-timeout: fmt.Println("TIMEOUT") } } fmt.Scanln() }
Ausgabe:
10 10 10 ... TIMEOUT
Jetzt, nach 2 Sekunden Inaktivität auf c1, ist „TIMEOUT“ korrekt gedruckt.
Das obige ist der detaillierte Inhalt vonWarum wird mein Go-Goroutine-Timeout-Kanal nie ausgelöst?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!