go - 如果已经运行,则不应执行 Ticker
问题描述
我有一些必须定期运行的功能。我为此使用了自动收报机。但是如果代码已经在运行,并且时间间隔再次过去,它不应该再次执行。
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 秒打印一次,但每次自动收报机的偶数转一圈,作业所花费的时间都比间隔时间长。我希望它不会运行并放弃那些滴答声。
我该怎么做呢?
解决方案
睡在同一个 goroutine 中只会延迟执行。同时,ticker 在一个单独的 goroutine 中运行。因此,即使您使用全局变量来维持执行状态 - 它也不会为您提供所需的睡眠结果。然而,在一个单独的 goroutine 中迁移整个“睡眠”会产生:
package main
import (
"fmt"
"time"
)
type Tick struct {
ticker *time.Ticker
executing bool
}
func somethingYouWantToDo(tick *Tick, flag *int, t time.Time) {
if tick.executing {
return
}
tick.executing = true
*flag = *flag + 1
if (*flag % 2 ==0 ) {
time.Sleep(time.Second*4)
}
fmt.Println("Current time: ", t)
tick.executing = false
}
func main() {
tick := &Tick{
ticker: time.NewTicker(3*time.Second),
}
flag := 0
defer tick.ticker.Stop()
for {
select {
case t := <-tick.ticker.C:
go somethingYouWantToDo(tick, &flag, t)
}
}
}
// output
// Current time: 2009-11-10 23:00:03 +0000 UTC m=+3.000000001
// Current time: 2009-11-10 23:00:06 +0000 UTC m=+6.000000001
// Current time: 2009-11-10 23:00:12 +0000 UTC m=+12.000000001
// Current time: 2009-11-10 23:00:15 +0000 UTC m=+15.000000001
// Current time: 2009-11-10 23:00:21 +0000 UTC m=+21.000000001
// Current time: 2009-11-10 23:00:24 +0000 UTC m=+24.000000001
// Current time: 2009-11-10 23:00:30 +0000 UTC m=+30.000000001
// Current time: 2009-11-10 23:00:33 +0000 UTC m=+33.000000001
// Current time: 2009-11-10 23:00:39 +0000 UTC m=+39.000000001
// Current time: 2009-11-10 23:00:42 +0000 UTC m=+42.000000001
// Current time: 2009-11-10 23:00:48 +0000 UTC m=+48.000000001
// Current time: 2009-11-10 23:00:51 +0000 UTC m=+51.000000001
// Current time: 2009-11-10 23:00:57 +0000 UTC m=+57.000000001
// Current time: 2009-11-10 23:01:00 +0000 UTC m=+60.000000001
// Current time: 2009-11-10 23:01:06 +0000 UTC m=+66.000000001
// Current time: 2009-11-10 23:01:09 +0000 UTC m=+69.000000001
推荐阅读
- javascript - 从另一台计算机调用我的页面时,httprequest 不起作用
- html - 离子载玻片中的离子卡全高
- javascript - 通过 Javascript 获取数组或对象的名称
- java - Java JNDI 查找名称兼容 Tomcat 和 Weblogic
- android - 将css渐变转换为android渐变(xml)
- php - mysqli_query() 失败 MAMP Phpmyadmin PHP
- python - 根据输入显示不同的字符串
- laravel - 使用 axios 从我的 react 本机应用程序将图片发送到我的 laravel API
- javascript - 将外部 jsx 文件添加到 html 页面(反应)
- pdf - 矩形工具 - 在屏幕上着色,但以 pdf 格式打印时清晰/透明?