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
Freigeben: 2024-12-18 11:38:15
Original
814 Leute haben es durchsucht

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

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!

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