Heim >Backend-Entwicklung >Golang >Warum wird mein Go-Goroutine-Timeout-Kanal nie ausgelöst?

Warum wird mein Go-Goroutine-Timeout-Kanal nie ausgelöst?

Linda Hamilton
Linda HamiltonOriginal
2024-12-11 07:10:10202Durchsuche

Why Doesn't My Go Goroutine Timeout Channel Ever Trigger?

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!

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