我在下面制作测试代码(gotest.go)package mainimport ( "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 最新版本。谢谢你。
2 回答
开心每一天1111
TA贡献1836条经验 获得超13个赞
内部睡眠是用绝对时间完成的:如果你Sleep(n)
在 time调用,T
程序被安排不会在 n
time之后醒来,而是在time T + n
。
这通常是可取的,因为:
时间通常不会倒流
由于操作系统调度延迟,反复休眠的程序可能会无限期地落后于计划;使用绝对时间可以通过缩短睡眠间隔来补偿延迟。
在您的情况下,您只需要等待一天让程序再次开始打印。:D
或者设置一个稍微过去的时间(比如 15 秒),然后看到程序在 15+2 秒后恢复。
附注。举例说明会发生什么:
在 2016-08-25 16:27:12 程序调用time.Sleep(2 * time.Second)
Go 运行时调度 goroutine 在 2016-08-25 的 16:27:14 被唤醒并让 goroutine 进入睡眠状态
同时 ...
用户设置系统时间2016-08- 24 16点27分13秒
现在超时计划在一天零一秒后到期。
这不应该发生在 Go 使用 POSIX CLOCK_MONOTONIC 或等效的系统上。
- 2 回答
- 0 关注
- 148 浏览
添加回答
举报
0/150
提交
取消