dsnw2651 2017-10-16 15:58
浏览 38

代码行情程序会告诉goroutine通过代码行情代码停止它吗?

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)
}

I thought when I call ticker.Stop(), ticker.C should tell the goroutine that it is over, so the for loop should end, but it doesn't look like that, the string "ticker stopped" is never printed.

  • 写回答

1条回答 默认 最新

  • duanpin2009 2017-10-16 16:08
    关注

    As JimB pointed out, the documentation for the time.Ticker specifies that Stop() does not close the channel, to prevent a read from the channel succeeding incorrectly. Your best bet is probably a quit 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)
    }
    

    https://play.golang.org/p/xTKNkMtdIf

    评论

报告相同问题?

悬赏问题

  • ¥15 关于#hadoop#的问题
  • ¥15 (标签-Python|关键词-socket)
  • ¥15 keil里为什么main.c定义的函数在it.c调用不了
  • ¥50 切换TabTip键盘的输入法
  • ¥15 可否在不同线程中调用封装数据库操作的类
  • ¥15 微带串馈天线阵列每个阵元宽度计算
  • ¥15 keil的map文件中Image component sizes各项意思
  • ¥20 求个正点原子stm32f407开发版的贪吃蛇游戏
  • ¥15 划分vlan后,链路不通了?
  • ¥20 求各位懂行的人,注册表能不能看到usb使用得具体信息,干了什么,传输了什么数据