【问题标题】:High resolution timers (millisecond precision) in Go on WindowsWindows 上 Go 中的高分辨率计时器(毫秒精度)
【发布时间】:2017-06-18 05:31:30
【问题描述】:

我正在尝试使用 Go 的 time.Timers 来安排需要以正确顺序运行的任务,精度约为半毫秒。这在 OSX 和 Linux 上运行良好,但在 Windows 上每次都失败。

以下代码演示了该问题。它设置了 5 个定时器,第一个为 1 毫秒,第二个为 2 毫秒,...,最后一个为 5 毫秒。一旦计时器触发,它的编号就会被打印出来。在 OSX 和 Linux 上,这显然会产生“12345”作为输出,但在 Windows 上,数字或多或少是随机的(在 Win 7 和 Windows Server 2012 上测试)。

package main

import (
    "fmt"
    "time"
)

func main() {
    var timer1, timer2, timer3, timer4, timer5 *time.Timer

    timer1 = time.NewTimer(1 * time.Millisecond)
    timer2 = time.NewTimer(2 * time.Millisecond)
    timer3 = time.NewTimer(3 * time.Millisecond)
    timer4 = time.NewTimer(4 * time.Millisecond)
    timer5 = time.NewTimer(5 * time.Millisecond)

    // should print 12345
    for {
        select {
        case <-timer1.C:
            fmt.Print("1")
        case <-timer2.C:
            fmt.Print("2")
        case <-timer3.C:
            fmt.Print("3")
        case <-timer4.C:
            fmt.Print("4")
        case <-timer5.C:
            fmt.Print("5")
        case <-time.After(200 * time.Millisecond):
            return // exit the program
        }
    }
}

我认为这种行为是由于 Go 1.6 中所做的更改(https://golang.org/doc/go1.6#runtime,第 4 段),其中 Windows 计时器精度从 1 毫秒降低到 16 毫秒,尽管它也应该以更短的间隔发生(大约 100 μs)。

是否有任何方法可以将全局 Windows 计时器精度重置回 1 毫秒,或者访问可以使上述示例正常工作的高分辨率计时器?

【问题讨论】:

  • go1.7rc 中的当前行为是什么?由于其性能,Windows 计时器周围发生了更多变化。您可能想通读 GH 中许多与 windows 计时器相关的问题。
  • 计时器似乎在 Go 1.7 的当前 beta 版本中具有更高的分辨率。感谢您的帮助。
  • 如果您对它感到满意,请将其添加为答案并将其标记为已接受可能是个好主意。然后,希望回答未回答问题的人可以跳过此步骤。

标签: windows go timer


【解决方案1】:

从 Go 1.7 开始,计时器现在具有更高的分辨率,应该不会出现这个问题。

【讨论】:

    猜你喜欢
    • 2018-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-05
    • 1970-01-01
    • 2012-11-12
    相关资源
    最近更新 更多