我在下面制作测试代码(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最新版本。 谢谢。
答案 0 :(得分:8)
内部睡眠是在绝对时间内完成的:如果您在时间Sleep(n)
致电T
,该计划将被安排在 n
时间后唤醒,但 时间T + n
。
这通常是优选的,因为:
时间通常不会倒退
由于OS调度延迟,反复睡眠的程序可能无限期地落后于计划;使用绝对时间使其通过较短的间隔睡眠来补偿延迟。
在您的情况下,您只需等待一天程序再次开始打印。 :d
或者设置一个过去的时间(比如说15秒),看看程序在15 + 2秒后恢复。
PS。澄清一个例子会发生什么:
2016-08-25 16:27:12程序调用{{1}} Go运行时计划在2016-08-25 16:27:14唤醒goroutine并让goroutine进入睡眠状态
同时......
用户将系统时间设置为2016-08- 24 16:27:13
现在超时计划在一天后过期。
这不应该发生在Go使用POSIX CLOCK_MONOTONIC或其等价物的系统上。