57 lines
2 KiB
Markdown
57 lines
2 KiB
Markdown
# 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 `default` wird der Code sofort nicht-blockierend ausgeführt, falls kein Channel bereit ist.
|
|
|
|
### Timeouts mit `time.After`
|
|
```go
|
|
select {
|
|
case res := <-responseCh:
|
|
fmt.Println("Ergebnis erhalten:", res)
|
|
case <-time.After(500 * time.Millisecond):
|
|
fmt.Println("Timeout nach 500ms!")
|
|
}
|
|
```
|
|
|
|
### Cancellation mit `context.Context`
|
|
```go
|
|
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`
|
|
|
|
1. **TODO 1 (`FastestResponse`)**: Lies aus zwei Kanälen `ch1` und `ch2` mit `select` das schnellste Ergebnis aus und gib es zurück.
|
|
2. **TODO 2 (`FetchWithTimeout`)**: Warte auf Daten aus `ch`. Wenn innerhalb von `timeout` keine Daten eintreffen, gib einen Fehler `errors.New("timeout exceeded")` zurück.
|
|
3. **TODO 3 (`TrySend` & `TryReceive`)**:
|
|
- `TrySend(ch chan<- int, val int) bool`: Sende ohne zu blockieren (gibt `true` bei Erfolg, `false` bei vollem Kanal).
|
|
- `TryReceive(ch <-chan int) (int, bool)`: Lies ohne zu blockieren (gibt `(val, true)` bei Daten, `(0, false)` bei leerem Kanal).
|
|
4. **TODO 4 (`QueryWithContext`)**: Führe die Funktion `fn func() string` in einer Goroutine aus und reagiere auf `<-ctx.Done()` für saubere Stornierung.
|
|
|
|
---
|
|
|
|
## 🧪 Tests ausführen
|
|
|
|
```bash
|
|
go test -v ./...
|
|
```
|