如果代码已经运行,则不应执行

leo*_*ion 4 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)
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

https://play.golang.org/p/2xV2MYInn4I

在操场上,自动收报机每 3 秒打印一次,但是自动收报机每偶数转一次,作业所花费的时间就比间隔时间要多。我希望它不会运行并删除那些蜱虫。

我该怎么做呢?

Pet*_*ter 5

股票行情通道是缓冲的,这就是为什么您可能会看到一个接一个的多个触发器。您可以通过简单地将股票代码的值传输到无缓冲通道来防止这种情况(另请注意,从股票代码接收到的 time.Time 值不是当前时间,而是最后一个股票报价的时间):

package main

import (
    "fmt"
    "time"
)

func main() {
    c := make(chan time.Time) // unbuffered
    ticker := time.NewTicker(3 * time.Second)
    defer ticker.Stop()

    go func() {
        for t := range ticker.C {
            select {
            case c <- t:
            default:
            }
        }
    }()

    for flag := 0; flag < 8; flag++ {
        <-c

        if flag%2 == 0 {
            time.Sleep(time.Second * 4)
        }
        fmt.Println("Current time: ", time.Now())
    }
}

// Output:
// Current time:  2020-02-19 12:21:57.095433032 +0100 CET m=+3.000213350
// Current time:  2020-02-19 12:22:04.095585208 +0100 CET m=+10.000365520
// Current time:  2020-02-19 12:22:06.095363327 +0100 CET m=+12.000143680
// Current time:  2020-02-19 12:22:13.095605268 +0100 CET m=+19.000385598
// Current time:  2020-02-19 12:22:15.095371885 +0100 CET m=+21.000152174
// Current time:  2020-02-19 12:22:22.095537562 +0100 CET m=+28.000317857
// Current time:  2020-02-19 12:22:24.095431317 +0100 CET m=+30.000211625
// Current time:  2020-02-19 12:22:31.095524308 +0100 CET m=+37.000304595
Run Code Online (Sandbox Code Playgroud)

在操场上尝试一下:https ://play.golang.org/p/jDe5uJiRVe2