golang time.Sleep bug?

use*_*281 7 time go

我在下面制作测试代码(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)
    }
}
Run Code Online (Sandbox Code Playgroud)

安慰

go run gotest.go
Run Code Online (Sandbox Code Playgroud)

并且,更改我的电脑的日期(例如:2015-07-30 - > 2015-07-29)

然后,println没有打印!!

是bug吗?

(它正在努力设定第二天)

我使用MacOs最新版本.谢谢.

chi*_*ill 10

内部睡眠是在绝对时间内完成的:如果您Sleep(n)按时调用T该程序,则不会 n一段时间唤醒,而是时间T + n.

这通常是优选的,因为:

  • 时间通常不会倒退

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

在您的情况下,您只需等待一天程序再次开始打印.:d

或者在过去设置一点时间(例如15秒),并看到程序在15 + 2秒后恢复.

PS.澄清一个例子会发生什么:

在2016-08-25 16:27:12程序调用time.Sleep(2 * time.Second) The Go运行时安排在2016-08-25 16:27:14 唤醒goroutine并让goroutine进入睡眠状态

同时......

用户设置系统时间2016-08- 24十六点27分13秒

现在超时计划在一天后过期一秒钟.

这不应该发生在Go使用POSIX CLOCK_MONOTONIC或其等价物的系统上.