Heim >Backend-Entwicklung >Golang >Wie kann ich HTTP-Anfragen in Go effektiv abbrechen, wenn eine Zeitüberschreitung auftritt?

Wie kann ich HTTP-Anfragen in Go effektiv abbrechen, wenn eine Zeitüberschreitung auftritt?

Patricia Arquette
Patricia ArquetteOriginal
2024-10-29 18:11:04851Durchsuche

How can I effectively cancel HTTP requests in Go when a timeout occurs?

Grundlegendes zum Goroutine-Timeout

In Ihrem bereitgestellten Code haben Sie einen Timeout-Mechanismus mithilfe einer Select-Anweisung implementiert, um entweder das Ergebnis der Funktion findCicCode() oder einen Timeout zu verarbeiten von 50 Millisekunden. Sie haben jedoch Bedenken hinsichtlich der Möglichkeit eines Ressourcenverlusts geäußert, wenn die HTTP-Aufrufe auch nach dem Timeout weiterhin ausgeführt werden.

Kontext für die Stornierung von HTTP-Anfragen nutzen

Um dieses Problem zu beheben, können Sie Folgendes nutzen Konzept des Kontexts in Go. Kontext bietet eine Möglichkeit, kontextspezifische Werte mit Goroutinen zu verknüpfen und ermöglicht den Abbruch. Mit Kontext können Sie laufende HTTP-Aufrufe abbrechen, wenn eine Zeitüberschreitung auftritt.

Hier ist ein Beispiel, wie Sie den Kontextabbruch für HTTP-Anfragen implementieren können:

<code class="go">package main

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

type Response struct {
    data   interface{}
    status bool
}

func Find() (interface{}, bool) {
    ch := make(chan Response, 1)

    ctx, cancel := context.WithTimeout(context.Background(), time.Second)
    defer cancel() // Ensure cancelation when the function exits

    go func() {
        data, status := findCicCode(ctx)
        ch <- Response{data: data, status: status}
    }()

    select {
    case response := <-ch:
        return response.data, response.status
    case <-time.After(50 * time.Millisecond):
        return "Request timed out", false
    }
}

func main() {
    data, timedOut := Find()
    fmt.Println(data, timedOut)
}</code>

In diesem geänderten Code:

  • Ein context.Context wird zusammen mit einer Abbruchfunktion erstellt.
  • Der Funktion findCicCode() wird der ctx übergeben, um laufende Anforderungen abzubrechen, wenn die Zeitüberschreitung auftritt.
  • Jeder Der innerhalb der Funktion findCicCode() erstellten HTTP-Anfrage wird der ctx mithilfe von req.WithContext(ctx) zugewiesen.
  • Wenn die Zeitüberschreitung auftritt, wird die Abbruchfunktion aufgerufen, die wiederum alle laufenden HTTP-Anfragen, die mit dem ctx verknüpft sind, abbricht .

Durch die Verwendung dieses Ansatzes stellen Sie sicher, dass alle laufenden HTTP-Anfragen abgebrochen werden, wenn das Zeitlimit erreicht ist, und verhindern so unnötigen Ressourcenverbrauch.

Das obige ist der detaillierte Inhalt vonWie kann ich HTTP-Anfragen in Go effektiv abbrechen, wenn eine Zeitüberschreitung auftritt?. 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