登录
首页 >  Golang >  Go问答

如何实现任务的间歇性重复执行?

来源:stackoverflow

时间:2024-02-08 23:27:21 435浏览 收藏

大家好,今天本人给大家带来文章《如何实现任务的间歇性重复执行?》,文中内容主要涉及到,如果你对Golang方面的知识点感兴趣,那就请各位朋友继续看下去吧~希望能真正帮到你们,谢谢!

问题内容

有没有办法在 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)
}

正确答案


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

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

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")
    }
}

Playground

文中关于的知识介绍,希望对你的学习有所帮助!若是受益匪浅,那就动动鼠标收藏这篇《如何实现任务的间歇性重复执行?》文章吧,也可关注golang学习网公众号了解相关技术文章。

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>