Heim >Backend-Entwicklung >Golang >Wie kann ich HTTP-Anfragen in Go effektiv abbrechen, wenn eine Zeitüberschreitung auftritt?
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.
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:
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!