【发布时间】: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 版本中具有更高的分辨率。感谢您的帮助。
-
如果您对它感到满意,请将其添加为答案并将其标记为已接受可能是个好主意。然后,希望回答未回答问题的人可以跳过此步骤。