go - Golang 中的 Ticker Stop 行为

标签 go ticker

如果我在一个股票 channel 上进行测距并调用 stop() channel 将停止但未关闭。

在这个例子中:

package main

import (
    "time"
    "log"
)

func main() {
    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)
}

运行产生:

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

所以 goroutine 永远不会退出。有没有更好的方法来处理这种情况?我应该关心 goroutine 从未退出吗?

最佳答案

使用了第二个 channel as Volker suggested .这就是我最终运行的结果:

package main

import (
    "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 {
        log.Println("tick")
        return true
    })

    time.Sleep(3 * time.Second)
    log.Println("stopping ticker")
    stop <- true
    time.Sleep(3 * time.Second)
}

关于go - Golang 中的 Ticker Stop 行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17797754/

相关文章:

http - 如何读取http响应正文以在golang中缓冲(不使用ioutil.ReadAll())

Go:通过 channel 传递函数

go - Go中的替代导入语法

go - 为什么 golang ticker.Stop() 在 tickerTest1 中不起作用?

html - CSS ticker 不能完全工作

jquery - 在 dygraph y 轴上绘制时间?

go - 如何在受互斥锁保护的结构中找到数据竞争?

json - json。在Go中解码TCP连接并同时记录原始数据

go - 股票代码仍然存在于内存中

java - (Java) 添加到计数器变量的代码