0 Tage Serie
go / intermediate
Snippet

Verwalten von Lebenszyklus und Abbruch mit Context

Das context-Paket von Go ermöglicht die Weitergabe von strukturierten Abbruchsignalen und Fristen über API-Grenzen und Goroutinen hinweg. Die Verwendung eines Kontexts verhindert Ressourcenlecks, indem Hintergrundaufgaben sauber benachrichtigt werden, die Verarbeitung einzustellen, sobald ihre übergeordnete Operation abläuft oder abgebrochen wird.

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
27
28
29
package main
import (
"context"
"fmt"
"time"
)
func worker(ctx context.Context) {
for {
select {
case <-ctx.Done():
fmt.Println("Worker stopped:", ctx.Err())
return
default:
fmt.Println("Working...")
time.Sleep(500 * time.Millisecond)
}
}
}
func main() {
ctx, cancel := context.WithTimeout(context.Background(), 2*time.Second)
defer cancel()
go worker(ctx)
time.Sleep(3 * time.Second)
}
Erklärung
1
context.WithTimeout(context.Background(), 2*time.Second)
Erstellt einen abgeleiteten Kontext, der nach 2 Sekunden automatisch ein Abbruchsignal über seinen Done-Kanal sendet.
2
defer cancel()
Stellt sicher, dass die internen Ressourcen des Kontexts sofort beim Beenden von main freigegeben werden, um Speicherlecks zu verhindern.
3
case <-ctx.Done():
Überwacht das Abbruchsignal und entsperrt die Arbeitsschleife, sobald das Timeout eintritt oder cancel explizit aufgerufen wird.
4
ctx.Err()
Gibt den Grund für den Abbruch des Kontexts zurück, wie z.B. context.DeadlineExceeded oder context.Canceled.