【发布时间】:2020-02-19 10:28:31
【问题描述】:
我有一些必须定期运行的功能。我为此使用了自动收报机。但是如果代码已经在运行,并且时间间隔再次过去,它不应该再次执行。
package main
import (
"fmt"
"time"
)
func main() {
ticker := time.NewTicker(3*time.Second)
flag := 0
defer ticker.Stop()
for {
select {
case t := <-ticker.C:
flag = flag + 1
if (flag % 2 ==0 ) {
time.Sleep(time.Second*4)
}
fmt.Println("Current time: ", t)
}
}
}
https://play.golang.org/p/2xV2MYInn4I
在操场上,自动收报机每 3 秒打印一次,但每次自动收报机的偶数转一圈,作业所花费的时间都比间隔时间长。我希望它不会运行并放弃那些滴答声。
我该怎么做?
【问题讨论】:
-
“我希望它不会运行并放弃那些滴答声。”你的期望是错误的。自动收报机间隔均匀,不知道您的代码做什么或不做什么。您可以自己“放弃”这个滴答声,也可以不使用 time.Ticker 但例如只是时间。考虑到您的任务花费了多长时间,您希望在下一个事件之前等待多长时间。
-
drop those ticks myself。为了执行此操作,我如何确定我的代码当前是否正在运行? -
"如果我的代码当前正在运行" 你不能,这不是代码的工作方式,你的代码没有“运行”(嗯,它一直运行到程序结束)。您的 代码 正在运行或未运行。您不希望您的代码在其最后完成时间晚于下一个刻度时运行。因此,请记住您的代码上次完成的时间,将其与代码时间戳进行比较,然后重新运行您的代码。
-
会尝试的。除了自动收报机之外,还有其他方法可以实现这一点吗?
-
是的,决定下次何时运行代码,然后就睡那么久。