Time 戈朗时间,睡虫?

Time 戈朗时间,睡虫?,time,go,Time,Go,我在下面生成测试代码(gotest.go) 控制台 go run gotest.go 还有,更改我电脑的日期 (示例:2015-07-30->2015-07-29) 然后呢,, println未打印 是虫子吗 (第二天开始工作) 我使用MacOs最新版本。 多谢各位 内部睡眠是在绝对时间内完成的:如果您在T时间调用sleep(n),则程序计划在n时间后不会醒来,而是在时间T+n醒来 这通常更可取,因为: 时间通常不会倒流 由于操作系统调度延迟,反复休眠的程序可能无限期地落后于调度;使用绝对时

我在下面生成测试代码(gotest.go)

控制台

go run gotest.go
还有,更改我电脑的日期 (示例:2015-07-30->2015-07-29)

然后呢,, println未打印

是虫子吗

(第二天开始工作)

我使用MacOs最新版本。
多谢各位

内部睡眠是在绝对时间内完成的:如果您在
T
时间调用
sleep(n)
,则程序计划在
n
时间后不会醒来,而是在时间
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-2416:27:13

现在,超时将在一天零一秒后过期


这种情况不应该发生在Go使用POSIX时钟或其等价物的系统上。

我在windows机器上没有这种行为。也许这是unix机器上的一个错误,因为例如在time.Sleep函数中使用时间比较,但这不是真的,或者我错过了什么?以下是时间的文档。Sleep将暂停当前goroutine至少一段时间。持续时间为负或为零会导致睡眠立即返回i验证和
time.Sleep(1*time.Second)
确实会使我的goroutine睡眠1秒。这是
time.Sleep
界面;我在内部说过,接口是以绝对超时实现的,请参阅
go run gotest.go