Heim >Backend-Entwicklung >Golang >Wie beendet man eine Goroutine ordnungsgemäß, wenn man einen Ticker-Kanal in Golang verwendet?
Verhalten des Tickerkanals in Golang
Wenn Sie über einen Tickerkanal iterieren und Stop() aufrufen, wird der Kanal angehalten, aber nicht geschlossen. Dies kann dazu führen, dass Goroutinen auf unbestimmte Zeit aktiv bleiben.
Fallbeispiel:
Betrachten Sie den folgenden Codeausschnitt:
package main import ( "fmt" "time" ) func main() { ticker := time.NewTicker(1 * time.Second) go func() { for _ = range ticker.C { fmt.Println("tick") } }() time.Sleep(3 * time.Second) fmt.Println("stopping ticker") ticker.Stop() time.Sleep(3 * time.Second) }
Ausgabe:
2013/07/22 14:26:53 tick 2013/07/22 14:26:54 tick 2013/07/22 14:26:55 tick 2013/07/22 14:26:55 stopping ticker
Wie Sie sehen können, iteriert die Goroutine trotz Anhalten des Tickers unbegrenzt weiter, da der Kanal nicht geschlossen ist.
Lösung:
Eine Möglichkeit, sicherzustellen, dass die Goroutine beendet wird, besteht darin, einen zweiten Kanal wie folgt zu verwenden:
package main import ( "fmt" "log" "time" ) // Run the function every tick // Return false from the func 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 { fmt.Println("tick") return true }) time.Sleep(3 * time.Second) fmt.Println("stopping ticker") stop <- true time.Sleep(3 * time.Second) }
In diesem Code:
Das obige ist der detaillierte Inhalt vonWie beendet man eine Goroutine ordnungsgemäß, wenn man einen Ticker-Kanal in Golang verwendet?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!