0 Tage Serie
go / intermediate
Snippet

Implementieren von Kanal-Timeouts mit select und time.After

Um zu verhindern, dass konkurrierende Operationen unbegrenzt blockieren, können Sie Timeouts mithilfe einer select-Anweisung in Kombination mit time.After implementieren. Die Funktion time.After gibt einen Kanal zurück, der nach einer festgelegten Dauer die aktuelle Zeit sendet und als Auslöser dient, um das blockierende Warten abzubrechen.

snippet.go
go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
package main
import (
"fmt"
"time"
)
func fetchData() <-chan string {
ch := make(chan string)
go func() {
time.Sleep(2 * time.Second) // Simulate slow work
ch <- "data source payload"
}()
return ch
}
func main() {
dataChan := fetchData()
select {
case result := <-dataChan:
fmt.Println("Received:", result)
case <-time.After(1 * time.Second):
fmt.Println("Operation timed out!")
}
}
Erklärung
1
select { ... }
Ermöglicht es einer Goroutine, gleichzeitig auf mehrere Kommunikationsoperationen zu warten, und führt die erste aus, die bereit ist.
2
case result := <-dataChan:
Ist erfolgreich und wird ausgeführt, wenn die Datenquelle fertiggestellt wird und Daten sendet, bevor das Timeout abläuft.
3
case <-time.After(1 * time.Second):
Empfängt nach 1 Sekunde vom Timeout-Kanal und bricht das Warten ab, falls der Hauptkanal immer noch blockiert ist.