golang time.Sleep 错误?

golang time.Sleep bug?

下面我做了测试代码(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 调用 Sleep(n),程序将不会在 [=12] 之后唤醒=] 时间,但 时间 T + n

这通常是可取的,因为:

  • 时间通常不会倒流

  • 由于 OS 调度延迟,重复休眠的程序可能会无限期地落后于调度;使用绝对时间使其通过缩短睡眠时间间隔来补偿延迟。

对于您的情况,您只需等待一天程序即可再次开始打印。 :D

或者将时间设置得稍微过去一点(比如 15 秒),然后看到程序在 15+2 秒后恢复。

PS。举例说明会发生什么:

在 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 或其等价物的系统上。

time.Sleep(20_000_000_000) n 为纳秒