Suche…
Syntax
- type CancelFunc func ()
- func Hintergrund () Kontext
- func TODO () Kontext
- func WithCancel (übergeordneter Context) (ctx Context, CancelFunc abbrechen)
- func WithDeadline (übergeordneter Kontext, Deadline-Zeit.Zeitpunkt) (Kontext, CancelFunc)
- func WithTimeout (übergeordneter Kontext, Timeout-Zeit.Dauer) (Kontext, CancelFunc)
- func WithValue (übergeordneter Kontext, Schlüsselschnittstelle {}, Wertschnittstelle {})
Bemerkungen
Das context
(in Go 1.7) oder das Paket golang.org/x/net/context
(Pre 1.7) ist eine Schnittstelle zum Erstellen von Kontexten, mit der Werte und Fristen für Anforderungsbereiche über API-Grenzen und zwischen Diensten übertragen werden können als einfache Implementierung der Schnittstelle.
beiseite: das wort "context" wird lose verwendet, um sich auf den gesamten baum oder auf einzelne blätter im baum zu beziehen, z. die tatsächlichen context.Context
Werte.
Auf hoher Ebene ist ein Kontext ein Baum. Neue Blätter werden der context.Context
hinzugefügt, wenn sie erstellt werden (ein context.Context
mit einem übergeordneten Wert), und Blätter werden niemals aus der context.Context
entfernt. Jeder Kontext hat Zugriff auf alle darüber liegenden Werte (der Datenzugriff fließt nur aufwärts), und wenn ein Kontext gelöscht wird, werden auch seine untergeordneten Elemente gelöscht (Abbruchsignale werden nach unten abgesetzt). Das Löschsignal wird mittels einer Funktion implementiert, die einen Kanal zurückgibt, der geschlossen wird (lesbar), wenn der Kontext gelöscht wird. Dies macht Kontexte zu einem sehr effizienten Weg, um das Parallelitätsmuster der Pipeline und des Abbruchs oder Timeouts zu implementieren.
ctx context.Context
haben Funktionen, die einen Kontext enthalten, das erste Argument ctx context.Context
. Dies ist zwar nur eine Konvention, sollte aber befolgt werden, da viele statische Analysewerkzeuge speziell nach diesem Argument suchen. Da es sich bei Context um eine Schnittstelle handelt, ist es auch möglich, vorhandene kontextähnliche Daten (Werte, die in einer Request-Call-Chain weitergegeben werden) in einen normalen Go-Kontext umzuwandeln und diese durch die Implementierung einiger Methoden rückwärtskompatibel zu verwenden. Darüber hinaus sind Kontexte für den gleichzeitigen Zugriff sicher, sodass Sie sie von vielen Goroutinen (unabhängig davon, ob sie auf parallelen Threads oder als gleichzeitige Coroutinen ausgeführt werden) ohne Angst verwenden können.
Lesen Sie weiter
Kontextbaum als gerichteter Graph dargestellt
Eine einfache Kontextbaumstruktur (die einige gängige Werte enthält, die möglicherweise einen Anforderungsbereich haben und in einen Kontext eingeschlossen sind), die aus Go-Code wie folgt aufgebaut ist:
// Pseudo-Go
ctx := context.WithValue(
context.WithDeadline(
context.WithValue(context.Background(), sidKey, sid),
time.Now().Add(30 * time.Minute),
),
ridKey, rid,
)
trCtx := trace.NewContext(ctx, tr)
logCtx := myRequestLogging.NewContext(ctx, myRequestLogging.NewLogger())
Ist ein Baum, der als gerichteter Graph dargestellt werden kann, der folgendermaßen aussieht:
Jeder untergeordnete Kontext hat Zugriff auf die Werte seiner übergeordneten Kontexte, sodass der Datenzugriff im Baum nach oben fließt (durch schwarze Kanten dargestellt). Aufhebungssignale dagegen ziehen den Baum hinunter (wenn ein Kontext abgebrochen wird, werden auch alle seine untergeordneten Elemente gelöscht). Der Löschsignalfluss wird durch die grauen Kanten dargestellt.
Verwendung eines Kontexts zum Abbrechen der Arbeit
Durch Übergeben eines Kontexts mit einer Zeitüberschreitung (oder mit einer Abbruchfunktion) an eine Funktion mit langer Laufzeit können Sie die Funktionsabbrüche abbrechen:
ctx, _ := context.WithTimeout(context.Background(), 200*time.Millisecond)
for {
select {
case <-ctx.Done():
return ctx.Err()
default:
// Do an iteration of some long running work here!
}
}