我正在尝试使用Go的time.Timer
来安排需要以正确的顺序运行的任务,精度大约为半毫秒。这在OSX和Linux上运行得非常好,但每次都在Windows上失败。
以下代码演示了此问题。它设置5个定时器,第一个为1 ms,第二个为2 ms,......,最后一个为5 ms。计时器触发后,会打印其编号。在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毫秒,或者访问高分辨率计时器以使上述示例有效?
答案 0 :(得分:2)
自Go 1.7开始,定时器现在具有更高的分辨率,不应出现此问题。