Kontext ist eine der entscheidenden Funktionen in Go, die Parallelität ermöglicht. In Go bezieht sich „Kontext“ auf ein Paket, das Funktionen für anforderungsbezogene Werte und Abbruchsignale über API-Grenzen hinweg bereitstellt.
Das Kontextpaket arbeitet gleichzeitig mit dem Parallelitätsmodell von Go, basierend auf dem Konzept der Goroutinen. Goroutinen sind leichtgewichtige Ausführungsthreads, die Sie effizient erstellen und verwalten können, wodurch es einfach ist, gleichzeitige Programme in Go zu erstellen.
Das Kontextpaket
Das Kontextpaket bietet Funktionen zum Abbrechen lang andauernder Funktionen oder ganzer Aufrufketten. Das Paket hilft auch beim Speichern von anforderungsbezogenen Werten für den Zugriff überall in der Aufrufkette. Diese Funktion ist praktisch bei der Arbeit mit APIs oder Microservices, bei denen Anforderungen mehrere Funktionsaufrufe umfassen können und Sie sie abbrechen oder ihnen bestimmte Werte zuweisen möchten.
So können Sie das Kontextpaket in Ihre importieren Programme gehen.
importieren"Kontext"
Kontextfunktionen übernehmen die Kontext Strukturtyp des Kontextpakets. Herkömmlich sollten Sie verwenden ctx als Name der Instanzvariable.
FunkOperationen(ctx-Kontext. Kontext) {
}
Funktionen können den Strukturtyp Context für andere Funktionen und Operationen zurückgeben.
FunkOperationen(ctx-Kontext. Kontext)Kontext.Kontext {
}
Sie können einen neuen Kontext mit erstellen MACHEN Funktion des Kontextpakets. Die TODO-Funktion erstellt einen neuen Kontext mit dem Wert von Kontext. Erledigt(), ein Kanal, der bei Kontextabbruch geschlossen wird. Sie sollten es als Platzhalter verwenden, wenn Sie einen Kontext benötigen, aber keine übergeordneten Kontexte geeignet sind.
importieren"Kontext"
Funkhauptsächlich() {
ctx := Kontext. MACHEN()
}
Alternativ die Hintergrund -Funktion erstellt einen neuen Kontext ohne Wert und einen leeren Done-Kanal.
ctx := Kontext. Hintergrund()
Sie sollten die Background-Funktion als Stamm einer Kontextstruktur verwenden.
Kontext mit Werten
Das Kontextpaket stellt Funktionalität zum Weitergeben von Werten und Abbruchsignalen bereit. Sie können die Werte für Informationen von anfragebezogenen Daten bis hin zu Kündigungssignalen und Fristen verwenden.
Das Kontextpaket ermöglicht auch die Erstellung von Kindkontexten, die von Elternkontexten geerbt werden, was eine Effizienz ermöglicht Behandlung von Werten und Abbruchsignalen in einem Programm, da Sie den Kontext mehrfach durchlaufen können Funktionen.
Hier ist ein Beispiel für die Übergabe von Kontext durch Funktionen mit dem Kontextpaket.
importieren (
"Kontext"
)FunkwertvollKontext(ctx-Kontext. Kontext)Kontext.Kontext {
zurückkehren Kontext. MitWert (ctx, "Hauptschlüssel", "hfouneqcelkwfu")
}
FunkKontextdaten empfangen(ctx-Kontext. Kontext)beliebig {
passKey := ctx. Wert("Hauptschlüssel")
zurückkehren passKey
}
Der wertvollKontext Die Funktion übernimmt eine Kontextinstanz und gibt eine Kontextinstanz für die folgende Funktion zurück. Die Kontextinstanz ist ein Wert, der mit erstellt wird MitWert Methode. Die WithValue-Methode nimmt die Kontextinstanz aus der Funktion und ein Schlüssel-Wert-Paar.
Um die Daten aus dem Kontext abzurufen, müssen Sie einen neuen Kontext mit dem erstellen MACHEN oder Hintergrund function und übergebe den Kontext an die Funktion (in diesem Fall valueContext) und empfange den Kontext mit der Kontextdaten empfangen Funktion.
Funkhauptsächlich() {
ctx := Kontext. Hintergrund()
ctx = wertvoller Kontext (ctx)
fmt. Println (receiveContextData (ctx))
}
Die ctx-Variable ist die Kontextinstanz aus der Background-Funktion. Die valueContext-Funktion übernimmt die ctx-Variable und gibt den Kontext mit einem Wert zurück, den die ReceiveContextData-Funktion übernimmt und den Wert aus dem Schlüssel-Wert-Paar zurückgibt.
Kontext-Timeouts und Fristen
Der Kontext -Paket bietet Funktionen zum Festlegen von Zeitüberschreitungen und Fristen im Betrieb. Das Festlegen von Zeitüberschreitungen und Fristen ist hilfreich für Vorgänge, die aufholen müssen.
Timeouts sind die Dauer einer Operation. Sie können ein Zeitlimit für einen Vorgang auf 4 Sekunden festlegen; Danach bricht der Kontext die Anfrage ab.
Andererseits definiert eine Frist den absoluten Punkt, an dem ein Vorgang abgebrochen werden sollte.
Du kannst den... benutzen Mit Timeout Methode zum Festlegen eines Kontext-Timeouts. So können Sie ein 2-Sekunden-Timeout festlegen.
Funkhauptsächlich() {
ctx, abbrechen := Kontext. WithTimeout (Kontext. Hintergrund(), 2 * Zeit. Zweite)
verschieben stornieren()
// einige Operationen
}
Der hauptsächlich Funktion erstellt einen Kontext mit einem Timeout von zwei Sekunden. Die WithTimeout-Funktion gibt eine Abbruchfunktion zurück, die Sie für den Abbruch beim Beenden der Hauptfunktion zurückstellen können.
Fristen können Sie mit dem erklären Mit Frist Methode. Die WithDeadline-Methode übernimmt eine Kontextinstanz und eine Deadline-Zeit.
Funketwas tun(ctx-Kontext. Kontext) {
FristZeit := Zeit. Jetzt().Hinzufügen(1500 * Zeit. Millisekunde)
ctx, ctxCancel := Kontext. WithDeadline (ctx, FristZeit)
verschieben ctxAbbrechen()// einige Operationen
ctxAbbrechen()
}
Der etwas tun Funktion übernimmt einen Kontext, und die FristZeit Variable ist die Zeit vor dem Kontext Termin. Der ctx Variable ist der Kontext mit einer Frist.
Der ctxAbbrechen Die Variable bricht den Kontext ab, wenn der Kontext seine Frist überschreitet.
Best Practices für die Verwendung von Kontexten in Go
Vermeiden Sie die Verwendung von Kontexten als globale Variablen. Die Verwendung von Kontexten als globale Variablen kann zu unerwartetem Codeverhalten und schwer nachzuvollziehenden Fehlern führen, und verwenden Sie den Kontext sparsam, um die Codekomplexität zu reduzieren.
Verwenden Sie schließlich Kontexte als Signale, nicht als Garantien. Das Abbrechen eines Kontexts garantiert nicht, dass alle Goroutinen aufhören zu laufen; es ist lediglich ein Signal, und Goroutinen sind kontextunabhängig.