有没有办法每隔一段时间做一些重复性的工作?

新手上路,请多包涵

有没有办法在 Go 中执行重复的后台任务?我在想 Java 中类似 Timer.schedule(task, delay, period) 的东西。我知道我可以使用 goroutine 和 Time.sleep() 来做到这一点,但我想要一些可以轻松停止的东西。

这是我得到的,但对我来说看起来很难看。有没有更清洁/更好的方法?

 func oneWay() {
    var f func()
    var t *time.Timer

    f = func () {
        fmt.Println("doing stuff")
        t = time.AfterFunc(time.Duration(5) * time.Second, f)
    }

    t = time.AfterFunc(time.Duration(5) * time.Second, f)

    defer t.Stop()

    //simulate doing stuff
    time.Sleep(time.Minute)
}

原文由 Steve Brisk 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 321
2 个回答

函数 time.NewTicker 创建一个发送周期性消息的通道,并提供一种方法来停止它。像这样使用它(未经测试):

 ticker := time.NewTicker(5 * time.Second)
quit := make(chan struct{})
go func() {
    for {
       select {
        case <- ticker.C:
            // do stuff
        case <- quit:
            ticker.Stop()
            return
        }
    }
 }()

您可以通过关闭 quit 频道来停止工作人员: close(quit)

原文由 Paul Hankin 发布,翻译遵循 CC BY-SA 3.0 许可协议

如果您不关心刻度偏移(取决于之前每次执行花费的时间)并且您不想使用通道,则可以使用本机范围功能。

IE

 package main

import "fmt"
import "time"

func main() {
    go heartBeat()
    time.Sleep(time.Second * 5)
}

func heartBeat() {
    for range time.Tick(time.Second * 1) {
        fmt.Println("Foo")
    }
}

操场

原文由 Alekc 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题