Heim  >  Artikel  >  Backend-Entwicklung  >  So verwenden Sie den Kontext, um das Zusammenführen von Anforderungsergebnissen in Go zu implementieren

So verwenden Sie den Kontext, um das Zusammenführen von Anforderungsergebnissen in Go zu implementieren

WBOY
WBOYOriginal
2023-07-22 14:51:251085Durchsuche

So verwenden Sie den Kontext, um das Zusammenführen von Anforderungsergebnissen in Go zu implementieren

In modernen verteilten Systemen ist es häufig erforderlich, mehrere gleichzeitige Anforderungen gleichzeitig zu initiieren und die Ergebnisse dieser Anforderungen zusammenzuführen. Das Kontextpaket in der Go-Sprache bietet eine elegante Möglichkeit, gleichzeitige Anfragen in solchen Szenarien zu verwalten und stellt sicher, dass ungültige Anfragen so früh wie möglich beendet werden können, wenn die Anfrage abgebrochen werden muss.

In diesem Artikel wird erläutert, wie Sie mithilfe des Kontexts Anforderungsergebnisse zusammenführen und relevante Codebeispiele bereitstellen.

Lassen Sie uns zunächst einige Schlüsselkonzepte und Verwendungsmethoden im Kontextpaket verstehen.

  1. Kontext: Kontext ist ein Kontextobjekt, das zur Steuerung von Goroutine verwendet werden kann. Bei gleichzeitigen Anfragen können wir das Kontextobjekt an jede Anfrage übergeben und das Kontextobjekt verwenden, um diese Anfragen zu verwalten und zu steuern.
  2. WithCancel: Verwenden Sie die Funktion WithCancel(parent), um einen neuen untergeordneten Kontext zu erstellen und eine Abbruchfunktion zurückzugeben. Wenn wir den Kontext abbrechen möchten, müssen wir nur die Abbruchfunktion aufrufen.
  3. WithTimeout: Verwenden Sie die Funktion WithTimeout(parent, timeout), um einen Kontext mit einem Timeout zu erstellen. Nach der angegebenen Zeit wird der Kontext automatisch abgebrochen.

Nachdem wir diese Grundkonzepte verstanden haben, können wir mit der Umsetzung der Zusammenführung der Anfrageergebnisse beginnen.

Nehmen wir zunächst an, wir haben einen Dienst, der gleichzeitig Anfragen an mehrere externe APIs stellen und deren Ergebnisse zusammenführen muss. Wir können den Kontext verwenden, um die folgenden Funktionen zu erreichen:

  1. Erstellen Sie einen übergeordneten Kontext und einen untergeordneten Kontext für jede Anfrage.
  2. Verwenden Sie in jeder Goroutine diese Unterkontexte, um Anfragen zu senden und auf die Ergebnisse zu warten.
  3. Wenn alle Anfragen abgeschlossen sind, senden Sie die Ergebnisse über den Kanal oder auf andere Weise zurück.

Als nächstes schauen wir uns einen Beispielcode an, der den Kontext verwendet, um das Zusammenführen von Anforderungsergebnissen zu implementieren:

package main

import (
    "context"
    "fmt"
    "net/http"
    "sync"
    "time"
)

func fetchData(ctx context.Context, url string, wg *sync.WaitGroup, ch chan<- string) {
    defer wg.Done()

    req, err := http.NewRequest("GET", url, nil)
    if err != nil {
        ch <- fmt.Sprintf("%s failed: %v", url, err)
        return
    }

    select {
    case <-ctx.Done():
        ch <- fmt.Sprintf("%s cancelled", url)
        return
    default:
    }

    client := http.DefaultClient
    resp, err := client.Do(req)
    if err != nil {
        ch <- fmt.Sprintf("%s failed: %v", url, err)
        return
    }

    select {
    case <-ctx.Done():
        ch <- fmt.Sprintf("%s cancelled", url)
    case <-time.After(1 * time.Second):
        body := make([]byte, 1024)
        _, _ = resp.Body.Read(body)
        ch <- fmt.Sprintf("%s fetched: %s", url, body)
    }

    resp.Body.Close()
}

func main() {
    ctx, cancel := context.WithCancel(context.Background())
    defer cancel()

    urls := []string{"https://www.google.com", "https://www.bing.com", "https://www.baidu.com"}

    var wg sync.WaitGroup
    results := make(chan string, len(urls))

    for _, url := range urls {
        wg.Add(1)
        go fetchData(ctx, url, &wg, results)
    }

    go func() {
        wg.Wait()
        close(results)
    }()

    for res := range results {
        fmt.Println(res)
    }
}

Im obigen Beispielcode erstellen wir zunächst einen übergeordneten Kontext und dann einen untergeordneten Kontext für jede Anforderung.

In der fetchData-Funktion verwenden wir die select-Anweisung, um zu prüfen, ob der Kontext abgebrochen wurde. Bei einer Stornierung wird die Anfrage sofort beendet. Wenn es nicht abgebrochen wird, senden Sie die Anfrage und warten Sie auf das Ergebnis.

Schließlich starten wir mehrere Goroutinen in der Hauptfunktion, um die Anfrage zu verarbeiten und die Ergebnisse über den Kanal zurückzugeben. Wir verwenden sync.WaitGroup, um auf den Abschluss aller Anforderungen zu warten, und können den gesamten Anforderungsprozess jederzeit über die Abbruchfunktion abbrechen.

Zusammenfassung:

Durch die Verwendung des Kontextpakets können wir gleichzeitige Anfragen elegant verwalten und ungültige Anfragen bei Bedarf rechtzeitig stornieren. Der obige Beispielcode zeigt, wie der Kontext zum Zusammenführen von Anforderungsergebnissen verwendet wird. Durch die rationale Verwendung des Kontexts können wir die gleichzeitigen Verarbeitungsfähigkeiten des Systems verbessern und gleichzeitig die Klarheit und Lesbarkeit des Codes beibehalten.

Der Schlüssel zur Verwendung von Kontext liegt in der korrekten Verwendung von Funktionen wie WithCancel und WithTimeout zum Erstellen von Unterkontexten und in der Verwendung von Select-Anweisungen in Goroutine, um zu prüfen, ob ein Abbruch oder eine Zeitüberschreitung erfolgen soll. Auf diese Weise können wir ungültige Anfragen bei Bedarf rechtzeitig beenden und die gültigen Anfrageergebnisse zusammenführen.

Durch tiefes Verständnis und flexible Nutzung des Kontextpakets können wir besser gleichzeitige und zuverlässige verteilte Systeme aufbauen.

Das obige ist der detaillierte Inhalt vonSo verwenden Sie den Kontext, um das Zusammenführen von Anforderungsergebnissen in Go zu implementieren. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
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