我做的测试代码(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-& gt;2015-07-29)
然后,println 不打印!!
是 bug 吗?
(它的工作设置第二天)
我使用 MacOs 最新版本。谢谢你。
内部睡眠是用绝对时间完成的:如果您在时间T
调用Sleep(n)
,则程序计划不在n
时间之后唤醒,而是在时间T + n
唤醒。
这通常是可取的,因为:
时间通常不会倒流
由于操作系统调度延迟,重复休眠的程序可能会无限期地落后于计划;使用绝对时间使其通过睡眠更短的时间间隔来补偿延迟。
在您的情况下,您只需要等待一天,程序就可以重新开始打印。:D
或者在过去设置一个时间(比如 15 秒),并看到程序在 15 + 2 秒后恢复。
PS.为了澄清一个例子会发生什么:
在 2016-08-25 16:27:12,程序调用time.Sleep(2 * time.Second)
Go 运行时计划在 2016-08-25 的 16:27:14 唤醒 goroutine,并使 goroutine 进入睡眠状态
同时...
用户将系统时间设置为 2016-08-2416:27:13
现在超时计划在一天零一秒后到期。
这不应该发生在 Go 使用 POSIX CLOCK_MONOTONIC 或其等效项的系统上。
时间。睡眠 (20_000_000_000) n 是纳秒
本站系公益性非盈利分享网址,本文来自用户投稿,不代表码文网立场,如若转载,请注明出处
评论列表(49条)