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 mainimport ("context""fmt""time")func worker(ctx context.Context) {for {select {case <-ctx.Done():fmt.Println("Worker stopped:", ctx.Err())returndefault: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.