Heim >Backend-Entwicklung >Golang >Wie kann ich die Ausführung einer Goroutine nach einem Timeout in Go ordnungsgemäß stoppen?
Goroutine-Ausführung bei Zeitüberschreitungen in Go stoppen
Der Versuch, die Goroutine-Ausführung bei einer Zeitüberschreitung zu beenden, kann wirkungslos erscheinen. Dies liegt daran, dass das Parallelitätsmodell von Go nach dem Fork-Join-Prinzip arbeitet, bei dem das Initiieren einer Goroutine (Fork) keine unmittelbare Kontrolle über deren Ausführung bietet. Die Kontrolle wird nur an Synchronisationspunkten wie der Kanalkommunikation wiedererlangt.
Im gegebenen Beispiel:
go func() { time.Sleep(10 * time.Second) fmt.Println("test") fmt.Println("test1") ch <- Response{data: "data", status: true} }()
Die Goroutine setzt die Ausführung fort, trotz des eingestellten Timeouts in:
case <-time.After(50 * time.Millisecond): return "Timed out", false
Das liegt daran, dass die Zeitüberschreitung den Empfänger (Leser) des Kanals betrifft, nicht den Absender. Da der Kanal gepuffert ist, kann der Absender die Ausführung ohne Unterbrechung fortsetzen.
Um das gewünschte Verhalten zu erreichen, müssen Synchronisationstechniken eingesetzt werden. Beispielsweise könnte der Kanal bei Zeitüberschreitung geschlossen werden, um eine weitere Kommunikation zu verhindern:
select { case <-ch: fmt.Println("Read from ch") res := <-ch return res.data, res.status case <-time.After(50 * time.Millisecond): close(ch) return "Timed out", false }
Das obige ist der detaillierte Inhalt vonWie kann ich die Ausführung einer Goroutine nach einem Timeout in Go ordnungsgemäß stoppen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!