如何在Golang中每秒多次执行命令?

时间:2016-09-08 08:17:08

标签: go

我想每秒打印N行。

for i := 0; i < N; i++ {
  fmt.Println(getLogs())
  time.Sleep(1000000000/N * time.Nanosecond)
}

但似乎fmt.Println()getLogs()也会耗费时间。所以实际上打印N行会花费超过1秒。

getLogs()fmt.Println()都需要花费1毫秒。我想每秒打印100万行。因此,打印1行将花费1毫秒到getLogs(),1毫秒打印,1毫秒睡眠...打印N行将耗费3秒。

更准确地实现这一目标的更好的解决方案?

2 个答案:

答案 0 :(得分:5)

您可以使用time.NewTicker(尝试The Go Playground):

package main

import (
    "fmt"
    "time"
)

func main() {
    const N = 4
    ticker := time.NewTicker(1000000000 / N * time.Nanosecond)
    for i := 0; i < N; i++ {
        fmt.Println(getLogs(i))
        <-ticker.C
    }
    ticker.Stop()
}

func getLogs(i int) int {
    time.Sleep(1 * time.Millisecond)
    return i
}

输出:

0
1
2
3

请参阅func NewTicker(d Duration) *Ticker文档:

  

NewTicker会返回一个新的Ticker,其中包含将发送的频道   具有duration参数指定的句点的时间。它调整了   间隔或下降滴答以弥补慢速接收器。持续时间d   必须大于零;如果没有,NewTicker将会恐慌。停止   自动收报机以释放相关资源。

另见:Running code at noon in Golang

答案 1 :(得分:0)

您可以使用time.Ticker之类的内容

for range time.Tick(time.Duration(1000000000/N) * time.Nanosecond){
    fmt.Println(getLogs())
    if cond {
        break
    }
}