Gelagat Saluran Ticker di Golang
Jika anda melelakan saluran ticker dan memanggil Stop(), saluran akan dijeda tetapi tidak ditutup. Ini boleh menyebabkan goroutine kekal aktif selama-lamanya.
Contoh Kes:
Pertimbangkan coretan kod berikut:
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) }
Output:
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
Seperti yang anda lihat, walaupun menghentikan ticker, goroutine terus berulang selama-lamanya kerana saluran tidak ditutup.
Penyelesaian:
Salah satu cara untuk memastikan goroutine ditamatkan adalah dengan menggunakan saluran kedua seperti berikut:
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) }
Dalam ini kod:
Atas ialah kandungan terperinci Bagaimana Cara Menamatkan Goroutine Dengan Betul Apabila Menggunakan Saluran Ticker di Golang?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!