我在下面制作测试代码(gotest.go)
package main import ( "fmt" "time" "sync" ) func main() { var wg sync.WaitGroup wg.Add(1) go testa() wg.Wait() } func testa() { for { fmt.Println("test goroutine") time.Sleep(2 * time.Second) } }
安慰
go run gotest.go
并且,更改我的计算机的日期
(例如:2015-07-30 – > 2015-07-29)
然后,
println没有打印!!
是bug吗?
(它正在努力设定第二天)
我使用MacOs最新版本.
谢谢.
内部睡眠是在绝对时间内完成的:如果你在时间T调用睡眠(n),程序被安排在n次之后不被唤醒,而是在时间T n.
这通常是优选的,因为:
>时间通常不会倒退
>由于OS调度延迟,反复睡眠的程序可能无限期地落后于计划;使用绝对时间使其通过较短的间隔睡眠来补偿延迟.
在您的情况下,您只需等待一天程序再次开始打印. :d
或者在过去设置一点时间(例如15秒),并看到程序在15秒后恢复.
PS.澄清一个例子会发生什么:
在2016-08-25 16:27:12程序调用time.Sleep(2 * time.Second)
Go运行时安排在2016-08-25 16:27:14唤醒goroutine并将goroutine置于睡眠状态
同时……
用户将系统时间设置为2016-08-24 16:27:13
现在超时计划在一天后过期一秒钟.
这不应该发生在Go使用POSIX CLOCK_MONOTONIC或其等价物的系统上.