如果已经运行,则不应执行 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 秒打印一次,但每次自动收报机的偶数转一圈,作业所花费的时间都比间隔时间长。我希望它不会运行并放弃那些滴答声。


我该怎么做呢?


翻过高山走不出你
浏览 158回答 2
2回答

莫回无

睡在同一个 goroutine 中只会延迟执行。同时,ticker 在一个单独的 goroutine 中运行。因此,即使您使用全局变量来维持执行状态 - 它也不会为您提供所需的睡眠结果。然而,在一个单独的 goroutine 中迁移整个“睡眠”会产生:package mainimport (&nbsp; &nbsp; "fmt"&nbsp; &nbsp; "time")type Tick struct {&nbsp; &nbsp; ticker *time.Ticker&nbsp; &nbsp; executing bool}func somethingYouWantToDo(tick *Tick, flag *int, t time.Time) {&nbsp; &nbsp; if tick.executing {&nbsp; &nbsp; &nbsp; &nbsp; return&nbsp; &nbsp; }&nbsp; &nbsp; tick.executing = true&nbsp; &nbsp; *flag = *flag + 1&nbsp; &nbsp; if (*flag % 2 ==0 ) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; time.Sleep(time.Second*4)&nbsp; &nbsp; }&nbsp; &nbsp;&nbsp; &nbsp; &nbsp; &nbsp; fmt.Println("Current time: ", t)&nbsp; &nbsp; tick.executing = false}func main() {&nbsp; &nbsp; tick := &Tick{&nbsp; &nbsp; &nbsp; &nbsp; ticker: time.NewTicker(3*time.Second),&nbsp; &nbsp; }&nbsp; &nbsp; flag := 0&nbsp; &nbsp; defer tick.ticker.Stop()&nbsp; &nbsp; for {&nbsp; &nbsp; &nbsp; &nbsp; select {&nbsp; &nbsp; &nbsp; &nbsp; case t := <-tick.ticker.C:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; go somethingYouWantToDo(tick, &flag, t)&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; }}// output// Current time:&nbsp; 2009-11-10 23:00:03 +0000 UTC m=+3.000000001// Current time:&nbsp; 2009-11-10 23:00:06 +0000 UTC m=+6.000000001// Current time:&nbsp; 2009-11-10 23:00:12 +0000 UTC m=+12.000000001// Current time:&nbsp; 2009-11-10 23:00:15 +0000 UTC m=+15.000000001// Current time:&nbsp; 2009-11-10 23:00:21 +0000 UTC m=+21.000000001// Current time:&nbsp; 2009-11-10 23:00:24 +0000 UTC m=+24.000000001// Current time:&nbsp; 2009-11-10 23:00:30 +0000 UTC m=+30.000000001// Current time:&nbsp; 2009-11-10 23:00:33 +0000 UTC m=+33.000000001// Current time:&nbsp; 2009-11-10 23:00:39 +0000 UTC m=+39.000000001// Current time:&nbsp; 2009-11-10 23:00:42 +0000 UTC m=+42.000000001// Current time:&nbsp; 2009-11-10 23:00:48 +0000 UTC m=+48.000000001// Current time:&nbsp; 2009-11-10 23:00:51 +0000 UTC m=+51.000000001// Current time:&nbsp; 2009-11-10 23:00:57 +0000 UTC m=+57.000000001// Current time:&nbsp; 2009-11-10 23:01:00 +0000 UTC m=+60.000000001// Current time:&nbsp; 2009-11-10 23:01:06 +0000 UTC m=+66.000000001// Current time:&nbsp; 2009-11-10 23:01:09 +0000 UTC m=+69.000000001

HUX布斯

代码通道是缓冲的,这就是为什么您可能会一个接一个地看到多个触发器。您可以通过简单地将代码的值传输到无缓冲通道来防止这种情况(另请注意,从代码接收的 time.Time 值不是当前时间,而是最后一次滴答的时间):package mainimport (&nbsp; &nbsp; "fmt"&nbsp; &nbsp; "time")func main() {&nbsp; &nbsp; c := make(chan time.Time) // unbuffered&nbsp; &nbsp; ticker := time.NewTicker(3 * time.Second)&nbsp; &nbsp; defer ticker.Stop()&nbsp; &nbsp; go func() {&nbsp; &nbsp; &nbsp; &nbsp; for t := range ticker.C {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; select {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; case c <- t:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; default:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; }()&nbsp; &nbsp; for flag := 0; flag < 8; flag++ {&nbsp; &nbsp; &nbsp; &nbsp; <-c&nbsp; &nbsp; &nbsp; &nbsp; if flag%2 == 0 {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; time.Sleep(time.Second * 4)&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; fmt.Println("Current time: ", time.Now())&nbsp; &nbsp; }}// Output:// Current time:&nbsp; 2020-02-19 12:21:57.095433032 +0100 CET m=+3.000213350// Current time:&nbsp; 2020-02-19 12:22:04.095585208 +0100 CET m=+10.000365520// Current time:&nbsp; 2020-02-19 12:22:06.095363327 +0100 CET m=+12.000143680// Current time:&nbsp; 2020-02-19 12:22:13.095605268 +0100 CET m=+19.000385598// Current time:&nbsp; 2020-02-19 12:22:15.095371885 +0100 CET m=+21.000152174// Current time:&nbsp; 2020-02-19 12:22:22.095537562 +0100 CET m=+28.000317857// Current time:&nbsp; 2020-02-19 12:22:24.095431317 +0100 CET m=+30.000211625// Current time:&nbsp; 2020-02-19 12:22:31.095524308 +0100 CET m=+37.000304595在操场上试一试:https: //play.golang.org/p/jDe5uJiRVe2
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go