有没有一种方法可以在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)
}
8条答案
按热度按时间qmb5sa221#
函数
time.NewTicker
创建了一个发送周期性消息的通道,并提供了一种停止它的方法。这样使用它(未经测试):您可以通过关闭
quit
通道来停止工作进程:close(quit)
。jdgnovmf2#
如果你不关心tick shifting(取决于每次执行之前花了多长时间),并且你不想使用通道,那么可以使用本机范围函数。
即
Playground
zzlelutf3#
比如说
Playground
elcex8rz4#
看看这个图书馆:https://github.com/robfig/cron
示例如下:
ercv8c1e5#
如果你想在任何时候停止它ticker
如果您不想停止它,请勾选:
u5rb5r596#
我使用以下代码:
它更简单,对我来说效果很好。
uqzxnwby7#
对这个问题的更广泛的回答可能是考虑Occam中经常使用的乐高积木方法,并通过JCSP提供给Java社区。有一个非常好的presentation by Peter Welch关于这个想法。
这种即插即用的方法直接转化为Go语言,因为Go语言使用与Occam相同的通信顺序过程基础。
因此,当涉及到设计重复性任务时,您可以将系统构建为一个简单组件(如goroutine)的简单网络,这些组件交换事件(即,消息或信号)。
这种方法是组合的:每组小组件本身可以作为更大的组件,直到无限。这可能非常强大,因为复杂的并发系统是由易于理解的砖块组成的。
ehxuflar8#
你可以像这样简单地使用gocron包:
gocron:https://github.com/go-co-op/gocron