Verwalten des Ticker-Stopp-Verhaltens in Go
Beim Umgang mit Kanälen ist es wichtig, das Verhalten von Sende- und Empfangsvorgängen zu berücksichtigen. Im Falle eines Tickerkanals verhindert der Aufruf von ticker.Stop(), dass der Ticker neue Werte erzeugt, aber der Kanal selbst bleibt geöffnet.
Herausforderung: Hängende Goroutine
Das bereitgestellte Code-Snippet demonstriert eine Goroutine, die sich über einen Tickerkanal erstreckt. Wenn jedoch ticker.Stop() aufgerufen wird, bleibt die Goroutine auf unbestimmte Zeit aktiv, da der Kanal nicht geschlossen ist.
Lösung: Verwendung eines zweiten Kanals
Für eine elegante Handhabung In dieser Situation kann ein sekundärer Kanal (Stopp) eingeführt werden. Die Goroutine kann in einer Select-Anweisung sowohl den Tickerkanal als auch den Stoppkanal abhören. Wenn auf dem Stoppkanal ein Signal zum Stoppen empfangen wird, kann sich die Goroutine selbst schließen und beenden.
Der geänderte Code unten enthält diese Lösung:
package main import ( "log" "time" ) // Every runs the provided function every tick. // Return false from the function to stop the ticker. func Every(duration time.Duration, work func(time.Time) bool) chan bool { ticker := time.NewTicker(duration) stop := make(chan bool, 1) go func() { defer log.Println("ticker stopped") for { select { case time := <-ticker.C: if !work(time) { stop <- true } case <-stop: return } } }() return stop } func main() { stop := Every(1*time.Second, func(time.Time) bool { log.Println("tick") return true }) time.Sleep(3 * time.Second) log.Println("stopping ticker") stop <- true time.Sleep(3 * time.Second) }
Wenn ticker.Stop() ist Jetzt aufgerufen, wird ein Signal an den Stoppkanal gesendet, wodurch die Goroutine ordnungsgemäß beendet wird, selbst nachdem der Ticker keine Werte mehr produziert.
Das obige ist der detaillierte Inhalt vonWie kann man eine Goroutine, die auf einem Ticker-Kanal in Go läuft, ordnungsgemäß stoppen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!