Rumah > Artikel > pembangunan bahagian belakang > Bagaimanakah Ticker.Stop() berkelakuan di Golang, dan bagaimanakah kita boleh memastikan keluar yang anggun untuk gorouti ticker?
Di Golang, saluran ticker biasanya digunakan untuk mencipta acara yang kerap berlaku. Walau bagaimanapun, adalah penting untuk memahami cara Stop() berkelakuan untuk memastikan pengendalian saluran yang betul.
Pertimbangkan coretan kod berikut:
ticker := time.NewTicker(1 * time.Second) go func() { for _ = range ticker.C { log.Println("tick") } log.Println("stopped") }() time.Sleep(3 * time.Second) log.Println("stopping ticker") ticker.Stop() time.Sleep(3 * time.Second)
Apabila ticker.Stop() dipanggil, ticker adalah dijeda, tetapi saluran tidak ditutup secara automatik. Ini bermakna goroutine akan berhenti seketika tetapi tidak akan tamat. Menjalankan kod di atas menghasilkan output berikut:
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
Oleh itu, goroutine kekal disekat menunggu acara ticker selanjutnya.
Untuk menyelesaikan isu ini, seseorang boleh menggunakan saluran kedua untuk menyampaikan hentikan permintaan kepada goroutine ticker. Berikut ialah contoh:
package main import ( "log" "sync" "time" ) type Ticker struct { sync.Mutex ticker *time.Ticker stop chan struct{} } func (t *Ticker) Start(d time.Duration) { t.Lock() defer t.Unlock() if t.ticker != nil { t.ticker.Stop() } t.ticker = time.NewTicker(d) t.stop = make(chan struct{}) go func() { for { select { case <-t.ticker.C: log.Println("tick") case <-t.stop: return } } }() } func (t *Ticker) Stop() { t.Lock() defer t.Unlock() if t.stop != nil { close(t.stop) t.ticker.Stop() } } func main() { t := Ticker{} t.Start(1 * time.Second) time.Sleep(3 * time.Second) log.Println("stopping ticker") t.Stop() time.Sleep(3 * time.Second) }
Dengan menggunakan saluran henti yang berasingan, kami boleh memastikan penamatan goroutine ticker dengan betul apabila kaedah Ticker.Stop() dipanggil.
Atas ialah kandungan terperinci Bagaimanakah Ticker.Stop() berkelakuan di Golang, dan bagaimanakah kita boleh memastikan keluar yang anggun untuk gorouti ticker?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!