Wie kann ich Kontexte in Go ohne Stornierungsweitergabe verwenden?

Mary-Kate Olsen
Freigeben: 2024-11-08 20:57:02
Original
981 Leute haben es durchsucht

How Can I Use Contexts in Go Without Cancellation Propagation?

Kontext ohne Abbruchweitergabe: Ein tiefer Einblick

Kontext in Go bietet einen Mechanismus, um beliebige Werte zusammen mit Anfragen zu übergeben und Abbrüche zu verfolgen. Standardmäßig nutzen alle Kontexte denselben Löschmechanismus. In bestimmten Szenarien kann es jedoch erforderlich sein, die Kontextweitergabe vom Abbruch zu entkoppeln.

Die Notwendigkeit nicht abbrechender Kontexte

Stellen Sie sich einen HTTP-Handler vor, der Aufgaben über die Lebensdauer der Anforderung hinaus ausführt. Nach der Rückgabe einer Antwort kann der Handler eine asynchrone Aufgabe in einer Goroutine initiieren. Diese Aufgabe erfordert möglicherweise Zugriff auf Kontextwerte, darf jedoch nicht beendet werden, wenn der ursprüngliche Anforderungskontext abgebrochen wird.

Benutzerdefinierte nicht abbrechende Kontexte erstellen

WithoutCancel wurde in Go 1.21 eingeführt und bietet eine einfache Möglichkeit um nicht aufhebende Kontexte zu schaffen. Mit dieser Methode kann man eine Kopie des ursprünglichen Kontexts erhalten, die alle seine gespeicherten Werte enthält, aber unabhängig von seinem Abbruchstatus bleibt.

Implementieren von nicht abbrechenden Kontexten

Vor Go 1.21, benutzerdefiniert Implementierungen von nicht aufhebenden Kontexten waren erforderlich. Der Schlüssel besteht darin, einen Typ zu erstellen, der die context.Context-Schnittstelle erfüllt und die folgenden Methoden überschreibt, um einen Abbruch zu verhindern:

  • Deadline(): Gibt immer eine Nullzeit zurück und setzt den zweiten Rückgabewert auf false. zeigt an, dass es keine Frist gibt.
  • Done(): Gibt einen Nullkanal zurück, was bedeutet, dass keine Stornierung möglich ist.
  • Err(): Gibt immer Null zurück, zeigt an, dass kein Fehler aufgetreten ist.

Darüber hinaus muss die Implementierung den ursprünglichen Kontext speichern und Value()-Aufrufe delegieren, um die gespeicherten Werte abzurufen.

Beispiel für die Verwendung einer Nicht-Stornierung Kontext

import (
    "context"

    "github.com/mypackage/mycontext"
)

func Handler(ctx context.Context) (interface{}, error) {
    result := doStuff(ctx)
    newContext := mycontext.WithoutCancel(ctx)
    go func() {
        doSomethingElse(newContext)
    }()
    return result
}
Nach dem Login kopieren

Fazit

Durch das Verständnis der Prinzipien hinter nicht aufhebenden Kontexten und die Nutzung der verfügbaren Tools können Entwickler benutzerdefinierte erstellen Lösungen oder nutzen Sie die integrierte Funktionalität von Go, um die gewünschte Kontextweitergabe ohne Abbruch zu erreichen.

Das obige ist der detaillierte Inhalt vonWie kann ich Kontexte in Go ohne Stornierungsweitergabe verwenden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage