Middle
Welche Möglichkeiten bietet die Erstellung eines untergeordneten Datenkontexts in Go?
sobes.tech KI
Antwort von AI
Das Erstellen eines Kindkontexts (mithilfe von context.WithCancel, context.WithDeadline, context.WithTimeout, context.WithValue) bietet die folgenden Möglichkeiten:
- Abbruch: Ermöglicht das Abbrechen von Operationen, die im Kindkontext gestartet wurden, ohne den Elternkontext zu beeinflussen. Dies wird durch Aufrufen der beim Erstellen des Kontexts zurückgegebenen Abbruchfunktion erreicht.
- Timeout / Deadline: Begrenzen die Ausführungszeit von Operationen. Wenn die Zeit vor Abschluss der Operation abläuft, wird der Kontext automatisch abgebrochen.
- Wertübertragung: Ermöglicht das Weitergeben von spezifischen Werten für Anfragen oder Operationen nach unten in der Funktionskette (z.B. Anforderungs-ID, Authentifizierungsdaten), ohne die Funktionssignaturen zu ändern.
- Hierarchie: Erstellt eine hierarchische Struktur von Kontexten. Das Abbrechen des Elternkontexts bricht automatisch alle seine Kindkontexte ab.
package main
import (
"context"
"fmt"
"time"
)
func main() {
// Elternkontext, der nach 3 Sekunden abgebrochen wird
parentCtx, cancelParent := context.WithTimeout(context.Background(), 3*time.Second)
defer cancelParent() // Sicherstellen, dass der Elternkontext abgebrochen wird
// Erstellen eines Kindkontexts mit Abbruch
childCtx, cancelChild := context.WithCancel(parentCtx)
defer cancelChild() // Sicherstellen, dass der Kindkontext abgebrochen wird
// Funktion, die auf den Abbruch des Kontexts wartet
go func(ctx context.Context) {
select {
case <-ctx.Done():
// Dieser Block wird ausgeführt, wenn der Kontext abgebrochen wird
fmt.Println("Kind-Goroutine abgebrochen:", ctx.Err())
}
}(childCtx) // Übergabe des Kindkontexts an die Goroutine
// Künstliche Verzögerung zur Demonstration des Abbruchs
time.Sleep(5 * time.Second)
fmt.Println("Programm beendet")
}
In diesem Beispiel führt der Elternkontext mit Timeout nach 3 Sekunden automatisch zum Abbruch des Kindkontexts, was zum Beenden der Goroutine führt. Der Kindkontext könnte auch manuell durch Aufruf von cancelChild() abgebrochen werden, vor Ablauf des Timeout des Elternkontexts.