Wie erstelle ich in Go einen Kontext, der die Stornierung ignoriert?

Mary-Kate Olsen
Freigeben: 2024-11-09 14:58:02
Original
606 Leute haben es durchsucht

How to Create a Context in Go That Ignores Cancellation?

Erstellen eines Kontexts ohne Abbruchpropagierung in Go

In Go enthält ein Kontext ausführungsbezogene Informationen wie Fristen und Abbruchtokens. In bestimmten Szenarien kann es jedoch erforderlich sein, einen separaten Kontext zu erstellen, der dieselben Daten teilt, aber von der Löschung des ursprünglichen Kontexts nicht betroffen ist.

Problemstellung

Die vorliegende Aufgabe besteht darin, einen „Klon“ zu erstellen " (oder Kopie) eines Go-Kontext-CTX, sodass:

  • Es alle im Original gespeicherten Werte enthält ctx.
  • Es wird nicht abgebrochen, wenn ctx abgebrochen wird.

Lösung

Da context.Context eine Schnittstelle ist, können Sie Ihre eigene Implementierung definieren, die ignoriert Aufhebungssignale. Hier ist ein Beispiel:

package main

import (
    "context"
    "time"
)

type noCancel struct {
    ctx context.Context
}

func (c noCancel) Deadline() (time.Time, bool)       { return time.Time{}, false }
func (c noCancel) Done() <-chan struct{}             { return nil }
func (c noCancel) Err() error                        { return nil }
func (c noCancel) Value(key interface{}) interface{} { return c.ctx.Value(key) }

// WithoutCancel returns a context that is never canceled.
func WithoutCancel(ctx context.Context) context.Context {
    return noCancel{ctx: ctx}
}

func main() {
    ctx := context.Background()
    clone := WithoutCancel(ctx)

    // Create a goroutine using the clone context.
    go func() {
        // This goroutine will never be interrupted by cancelations on `ctx`.
        time.Sleep(time.Second)
    }()
}
Nach dem Login kopieren

Verwendung

Sie können die WithoutCancel-Funktion verwenden, um einen Klonkontext innerhalb einer beliebigen Funktion oder Methode zu erstellen:

func f(ctx context.Context) {
    // Create a non-cancelable clone.
    clone := WithoutCancel(ctx)

    // Start an async task using the clone context.
    go func() {
        // This goroutine will not be affected by cancellations on `ctx`.
    }()
}
Nach dem Login kopieren

Fazit

Diese Lösung bietet eine einfache Möglichkeit, einen Kontext zu erstellen, der niemals abgebrochen wird, sodass Sie asynchrone Aufgaben ausführen können, die den ursprünglichen Kontext überdauern. Dies ist besonders nützlich, wenn Sie eine vorzeitige Beendigung von Hintergrundaufgaben aufgrund eines Kontextabbruchs vermeiden möchten.

Das obige ist der detaillierte Inhalt vonWie erstelle ich in Go einen Kontext, der die Stornierung ignoriert?. 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
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!