Heim >Backend-Entwicklung >Golang >Wie kann ich eine Go-Goroutine-Ausführung nach einer Zeitüberschreitung stoppen?
Goroutine-Ausführung bei Timeout stoppen
In Go bieten Goroutinen eine einfache Möglichkeit, Code gleichzeitig auszuführen. Manchmal ist es jedoch notwendig, eine Goroutine nach einer bestimmten Zeitspanne zu stoppen.
Problem:
Ein Benutzer ist auf ein Problem gestoßen, bei dem eine Goroutine auch nach einer Zeitüberschreitung weiter ausgeführt wurde eingestellt wurde. Sie gingen davon aus, dass die Goroutine bei Erreichen des Timeouts sofort anhalten würde, aber stattdessen wurden zusätzliche Meldungen ausgegeben. Hier ist ein Beispielcode:
type Response struct { data interface{} status bool } func Find() (interface{}, bool) { ch := make(chan Response, 1) go func() { time.Sleep(10 * time.Second) fmt.Println("test") fmt.Println("test1") ch <- Response{data: "data", status: true} }() select { case <-ch: fmt.Println("Read from ch") res := <-ch return res.data, res.status case <-time.After(50 * time.Millisecond): return "Timed out", false } }
Erwartete Ausgabe:
Tatsächliche Ausgabe:
Analyse:
Das Problem entsteht, weil das Timeout auf der Empfangsseite eingestellt ist des Kanals, nicht auf der sendenden Seite. Während das Timeout korrekt erkennt, dass innerhalb von 50 Millisekunden keine Daten empfangen wurden, hindert es die Goroutine nicht daran, danach weiter auszuführen und Daten auf dem Kanal zu senden.
Lösung:
Da es in Go nicht möglich ist, die Ausführung einer Goroutine direkt zu unterbrechen, gibt es alternative Ansätze erforderlich:
Das obige ist der detaillierte Inhalt vonWie kann ich eine Go-Goroutine-Ausführung nach einer Zeitüberschreitung stoppen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!