首页 > 文章列表 > 有没有办法每隔一段时间做重复的任务?

有没有办法每隔一段时间做重复的任务?

golang
167 2023-03-08

问题内容

有没有办法在 Go 中执行重复的后台任务?我正在考虑类似Timer.schedule(task, delay, period)Java的东西。我知道我可以使用 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)
}

正确答案

该函数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)