package main
import "fmt"
import "time"
func main() {
ticker := time.NewTicker(time.Millisecond * 500)
go func() {
for t := range ticker.C {
fmt.Println("Tick at", t)
}
fmt.Println("ticker stopped")
}()
time.Sleep(time.Second * 5)
ticker.Stop()
time.Sleep(time.Second * 5)
}
我想当我调用 ticker.Stop() 时,ticker.C 应该告诉 goroutine 它结束了,所以 for 循环应该结束,但它看起来不是那样,字符串“ticker stopped”永远不会打印出来。
最佳答案
正如 JimB 指出的那样,time.Ticker 的文档指定 Stop() 不会关闭 channel ,以防止错误地从 channel 读取。
你最好的选择可能是退出 channel 。
package main
import "fmt"
import "time"
func main() {
ticker := time.NewTicker(time.Millisecond * 500)
quit := make(chan struct{})
go func() {
for {
select {
case t := <-ticker.C:
fmt.Println("Tick at", t)
case <-quit:
fmt.Println("ticker stopped")
return
}
}
}()
time.Sleep(time.Second * 5)
ticker.Stop()
close(quit)
time.Sleep(time.Second * 5)
}
关于go - 一个 ticker 是否通过它的 ticker.C 告诉一个 goroutine 它被停止了?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46774410/