有没有办法在 Go 中执行重复的后台任务?我在想类似Timer.schedule(task, delay, period)Java的东西。我知道我可以使用 goroutine and 来做到这一点Time.sleep(),但我想要一些可以轻松停止的东西。
Timer.schedule(task, delay, period)
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创建一个发送周期性消息的通道,并提供一种停止它的方法。像这样使用它(未经测试):
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)。
quit
close(quit)