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 mainimport ("fmt""time")func fetchData() <-chan string {ch := make(chan string)go func() {time.Sleep(2 * time.Second) // Simulate slow workch <- "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.