如何在golang中停止周期性函数

所以我有一个每 2 秒调用一次的函数。像这样


package main


import (

    "fmt"

    "time"

)


func doEvery(d time.Duration, f func(time.Time)) {

    for x := range time.Tick(d) {

        f(x)

    }

}


func helloworld(t time.Time) {

    fmt.Printf("%v: Hello, World!\n", t)

}


func main() {

    doEvery(20*time.Millisecond, helloworld)

}

现在假设我不再希望此函数每 2 秒执行一次。有没有办法在golang中实现这一点?或者有没有比这更好的方法在 golang 中调用周期性函数?谢谢你。


婷婷同学_
浏览 136回答 1
1回答

守着一只汪

time.Tick()无法停止的状态文档:Tick 是 NewTicker 的便捷包装器,仅提供对 ticking 通道的访问。虽然 Tick对于不需要关闭 Ticker 的客户端很有用,但请注意,如果没有办法将其关闭,则底层 Ticker 无法被垃圾收集器恢复;它“泄漏”。如果您需要停止它,请改用它time.NewTicker()。在一个新的 goroutine 中运行doEvery(),并传递一个通道给它,它可以让你停止它,例如通过关闭通道:func doEvery(d time.Duration, done chan bool, f func(time.Time)) {&nbsp; &nbsp; ticker := time.NewTicker(d)&nbsp; &nbsp; defer ticker.Stop()&nbsp; &nbsp; for {&nbsp; &nbsp; &nbsp; &nbsp; select {&nbsp; &nbsp; &nbsp; &nbsp; case <-done:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; fmt.Println("Done!")&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return&nbsp; &nbsp; &nbsp; &nbsp; case t := <-ticker.C:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; f(t)&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; }}测试它:done := make(chan bool)go doEvery(300*time.Millisecond, done, helloworld)time.Sleep(time.Second)close(done)time.Sleep(time.Second)fmt.Println("Quitting")这将输出(在Go Playground上尝试):2009-11-10 23:00:00.3 +0000 UTC m=+0.300000001: Hello, World!2009-11-10 23:00:00.6 +0000 UTC m=+0.600000001: Hello, World!2009-11-10 23:00:00.9 +0000 UTC m=+0.900000001: Hello, World!Done!Quitting
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go