Goroutine-Timeout
Die bereitgestellte Funktion Find() verwendet eine Goroutine, um eine Reihe von HTTP-Anfragen zu stellen und deren Antworten zu verarbeiten. Es besteht jedoch die Sorge, dass diese Anfragen im Hintergrund weiterlaufen, selbst wenn sie das angegebene Zeitlimit überschreiten.
Potenzielles Goroutine-Leck
Es ist unwahrscheinlich, dass ein Goroutine-Leck vorliegt der Code. Wenn die Find()-Funktion eine Zeitüberschreitung zurückgibt, wird die Haupt-Goroutine fortgesetzt und die Hintergrund-Goroutine im Wesentlichen aufgegeben.
Abbruch von HTTP-Anfragen
Um zu vermeiden, dass nach einer Zeitüberschreitung Anfragen gestellt werden , besteht die Lösung darin, für jede HTTP-Anfrage einen context.Context zu verwenden. Ein Kontext ermöglicht es Ihnen, die Anfrage abzubrechen, wenn eine Zeitüberschreitung auftritt.
<code class="go">func Find() (interface{}, bool) { ctx, cancel := context.WithTimeout(context.Background(), 50*time.Millisecond) defer cancel() ch := make(chan Response, 1) go func() { data, status := findCicCode() ch <- Response{data: data, status: status} }() select { case response := <-ch: return response.data, response.status case <-ctx.Done(): return "Request timed out", false } }</code>
Wenn die Zeitüberschreitung auftritt, bricht der Aufruf von cancel() alle im ctx erstellten HTTP-Anfragen ab. Dadurch wird verhindert, dass diese Anfragen weiter verarbeitet werden oder Ressourcen verbrauchen.
Das obige ist der detaillierte Inhalt vonWie kann verhindert werden, dass HTTP-Anfragen nach einer Zeitüberschreitung in einer Goroutine fortgesetzt werden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!