为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
婷婷同学_ 2022-11-08 15:24:16
所以我有一个每 2 秒调用一次的函数。像这样package mainimport (    "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 中调用周期性函数?谢谢你。
查看完整描述

1 回答

?
守着一只汪

TA贡献1872条经验 获得超3个赞

time.Tick()无法停止的状态文档:

Tick 是 NewTicker 的便捷包装器,仅提供对 ticking 通道的访问。虽然 Tick对于不需要关闭 Ticker 的客户端很有用,但请注意,如果没有办法将其关闭,则底层 Ticker 无法被垃圾收集器恢复;它“泄漏”。

如果您需要停止它,请改用它time.NewTicker()。在一个新的 goroutine 中运行doEvery(),并传递一个通道给它,它可以让你停止它,例如通过关闭通道:

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

    ticker := time.NewTicker(d)

    defer ticker.Stop()


    for {

        select {

        case <-done:

            fmt.Println("Done!")

            return

        case t := <-ticker.C:

            f(t)

        }

    }

}

测试它:


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


查看完整回答
反对 回复 2022-11-08
  • 1 回答
  • 0 关注
  • 115 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信