Rumah >pembangunan bahagian belakang >Golang >Bagaimana Cara Menamatkan Goroutine Dengan Betul Apabila Menggunakan Saluran Ticker di Golang?
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!