Heim >Backend-Entwicklung >Golang >Warum wird mein Golang-Timeout-Fall nicht ausgelöst, wenn ich Kanäle verwende?

Warum wird mein Golang-Timeout-Fall nicht ausgelöst, wenn ich Kanäle verwende?

Patricia Arquette
Patricia ArquetteOriginal
2024-12-18 11:38:15824Durchsuche

Why Doesn't My Golang Timeout Case Trigger When Using Channels?

Timeout-Fall wird in Golang mit Kanälen nicht ausgelöst

Im bereitgestellten Code wird ein Timeout-Fall mithilfe einer SELECT-Anweisung und eines time.After()-Aufrufs implementiert. Der Timeout-Fall wird jedoch nicht ausgeführt.

Erklärung

Der Grund dafür ist, dass die Funktion time.After() bei jedem Aufruf einen neuen Kanal erstellt. Wenn die select-Anweisung einen Wert vom c1-Kanal empfängt (in der ersten for-Schleife), wird der vorhandene time.After()-Kanal verworfen. Somit hat der Timeout-Fall nie die Möglichkeit, einen Wert zu empfangen.

Lösung

Um dieses Problem zu beheben, erstellen Sie den time.After()-Kanal nur einmal, außerhalb der for-Schleife. Dadurch wird sichergestellt, dass während der gesamten Ausführung derselbe Kanal für den Timeout-Fall verwendet wird.

Hier ist der geänderte Code:

func main() {
    c1 := make(chan int, 1)

    go func() {
        for {
            time.Sleep(1500 * time.Millisecond)
            c1 <- 10
        }
    }()

    timeout := time.After(2000 * time.Millisecond)
    for {
        select {
        case i := <-c1:
            fmt.Println(i)
        case <-timeout:
            fmt.Println("TIMEOUT")
        }
    }

    fmt.Scanln()
}

Mit dieser Änderung wird der Timeout-Fall nach 2 Sekunden erfolgreich ausgeführt , solange innerhalb dieses Zeitraums kein Wert vom c1-Kanal empfangen wird.

Das obige ist der detaillierte Inhalt vonWarum wird mein Golang-Timeout-Fall nicht ausgelöst, wenn ich Kanäle verwende?. 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