Goroutine-Ausführung bei Zeitüberschreitung abbrechen
In Go-Routinen kann es erforderlich sein, Vorgänge nach einem bestimmten Zeitschwellenwert abzubrechen. Dies kann eine Herausforderung darstellen, da Go Goroutinen normalerweise asynchron ausführt, ohne direkte Kontrolle über deren Ausführung. Ein häufiges Szenario entsteht bei der Verwendung des Iris-Frameworks, in dem Situationen auftreten können, in denen eine Goroutine die Ausführung fortsetzt, auch nachdem eine Zeitüberschreitung aufgetreten ist.
Beachten Sie den folgenden Codeausschnitt:
package main import ( "fmt" "time" ) func main() { Res := make(chan Response, 1) go func() { time.Sleep(10 * time.Second) fmt.Println("test") Res <- Response{data: "data", status: true} }() select { case <-Res: fmt.Println("Read from ch") res := <-Res fmt.Println(res.data, res.status) case <-time.After(50 * time.Millisecond): fmt.Println("Timed out") } } type Response struct { data interface{} status bool }
Wie dargestellt Im Beispiel wird nach einer Verzögerung von 10 Sekunden eine Goroutine zum Drucken von Tests gestartet. Ein Kanal (Res) wird verwendet, um die Kommunikation zwischen der Goroutine und der Haupt-Goroutine zu erleichtern. Eine Select-Anweisung wird verwendet, um entweder auf eine Antwort von der Goroutine oder auf eine Zeitüberschreitung von 50 Millisekunden zu warten.
Das erwartete Verhalten ist jedoch, dass die Goroutine beendet werden sollte, sobald die Zeitüberschreitung auftritt. Stattdessen zeigt die Ausgabe, dass der Test immer noch gedruckt wird, obwohl das Timeout abgelaufen ist.
Dies liegt daran, dass es in Go keine einfache Methode gibt, um die Ausführung einer laufenden Goroutine zwangsweise zu unterbrechen. Go arbeitet nach einem Fork-Join-Parallelitätsmodell, bei dem eine neue Goroutine als separater Ausführungsthread erstellt wird. Nach der Erstellung fällt die Planung und Handhabung von Goroutinen in den Verantwortungsbereich der Go-Laufzeit.
Um dieses Problem zu beheben, wird empfohlen, Synchronisierungstechniken zu verwenden, die eine detailliertere Kontrolle über das Verhalten von Goroutinen ermöglichen.
Das obige ist der detaillierte Inhalt vonWie kann ich die Ausführung einer Go-Goroutine nach einer Zeitüberschreitung abbrechen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!