2 KiB
2 KiB
Go 11: select Multiplexing, Context & Timeouts ⚡
Willkommen zu Modul 11 des Go Cloud & Concurrency Lehrpfads!
In verteilten Cloud-Systemen müssen Services tolerant gegenüber Netzwerklatenzen und Ausfällen sein. Mit select, nicht-blockierenden Channel-Operationen und context.Context baust du robuste, zeitgesteuerte und abbrechbare Workflows.
💡 1. Das Wichtigste in Kürze
select Multiplexing
- Lauscht gleichzeitig auf mehrere Channels.
- Der erste bereite Channel-Case gewinnt.
- Sind mehrere bereit, entscheidet Go pseudozufällig.
- Mit
defaultwird der Code sofort nicht-blockierend ausgeführt, falls kein Channel bereit ist.
Timeouts mit time.After
select {
case res := <-responseCh:
fmt.Println("Ergebnis erhalten:", res)
case <-time.After(500 * time.Millisecond):
fmt.Println("Timeout nach 500ms!")
}
Cancellation mit context.Context
ctx, cancel := context.WithTimeout(context.Background(), 2*time.Second)
defer cancel()
select {
case <-ctx.Done():
return "", ctx.Err() // context.DeadlineExceeded oder context.Canceled
case data := <-workCh:
return data, nil
}
🎯 Aufgaben in aufgabe.go
- TODO 1 (
FastestResponse): Lies aus zwei Kanälench1undch2mitselectdas schnellste Ergebnis aus und gib es zurück. - TODO 2 (
FetchWithTimeout): Warte auf Daten ausch. Wenn innerhalb vontimeoutkeine Daten eintreffen, gib einen Fehlererrors.New("timeout exceeded")zurück. - TODO 3 (
TrySend&TryReceive):TrySend(ch chan<- int, val int) bool: Sende ohne zu blockieren (gibttruebei Erfolg,falsebei vollem Kanal).TryReceive(ch <-chan int) (int, bool): Lies ohne zu blockieren (gibt(val, true)bei Daten,(0, false)bei leerem Kanal).
- TODO 4 (
QueryWithContext): Führe die Funktionfn func() stringin einer Goroutine aus und reagiere auf<-ctx.Done()für saubere Stornierung.
🧪 Tests ausführen
go test -v ./...