go - 一个 ticker 是否通过它的 ticker.C 告诉一个 goroutine 它被停止了?

标签 go channel 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)
}

我想当我调用 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)
}

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

关于go - 一个 ticker 是否通过它的 ticker.C 告诉一个 goroutine 它被停止了?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46774410/

相关文章:

go - 并发快速排序

go - 无法将 go lang 应用程序部署到 AWS Elastic Beanstalk

intellij-idea - 我用IntelliJ IDEA作为golang IDE,系统环境已经设置了GOPATH,但是IDEA加载不出来

loops - 为什么我的 go 协程在处理后卡住了?

go for range slice 和 goroutine 方法调用,背后的逻辑

go - 使用接口(interface)获取结构的值

linux - 使左/右音频 channel 静音

multithreading - 一旦Chan中没有更多数据要处理时,如何停止线程?

go - 如何编写一个目录遍历程序,可以反馈子目录、文件等的总数?

go - goroutine 没有输出