如何每秒重复 N 次函数?

Max*_*Lis 4 go

如何在 Go 中每秒重复 N 次函数?

我可以:

N := 30 //Repeat 30 times per second
for {
    //Do something
    time.Sleep(time.Second * time.Duration(N))
}
Run Code Online (Sandbox Code Playgroud)

但这只是使重复之间的间隔

Dav*_*e C 6

您可以使用 atime.Ticker来为您处理所有簿记工作。唯一的“问题”是,如果您的操作花费的时间比预期长,您将失去蜱虫(因此每秒运行的次数少于 N)。

func doSomething() {
    const N = 30
    ticker := time.NewTicker(time.Second / N)
    for range ticker.C {
        fmt.Println("Do anything that takes no longer than 1/Nth of a second")
    }
}
Run Code Online (Sandbox Code Playgroud)

https://play.golang.org/p/Gq-tWMvxIk


Nat*_*ord 5

有两种选择,都不能保证每秒 x 次。

  • 将 N 设置为 not 30but 1/30。因此睡眠将持续 1/30 秒。
  • 有一个内部 for 循环,循环 30 次并执行您的“做某事”,然后在退出时点击休眠一秒钟的语句。

选项一:

N := 30 //Repeat 30 times per second
for {
    //Do something
    time.Sleep(time.Duration(1e9 / N))  //time.second constant unnecessary (see kostya comments)
}
Run Code Online (Sandbox Code Playgroud)

选项二:

N := 1  //Sleep duration of one second
for {
    for i := 1;  i<=30; i++ {
        //Do something
    }
    time.Sleep(time.Second * time.Duration(N))
}
Run Code Online (Sandbox Code Playgroud)

请注意,在选项二中,一切都同时发生,然后您等待一秒钟。第一个选项将隔开第二个选项。由于计算机中的时间安排,这将是不精确的:睡眠不能保证它会在您期望的时候准确地唤醒。