golang time.Sleep bug?

时间:2015-07-31 08:06:55

标签: 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)
    }
}

控制台

go run gotest.go

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

然后, println没有打印!!

是bug ??

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

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

1 个答案:

答案 0 :(得分:8)

内部睡眠是在绝对时间内完成的:如果您在时间Sleep(n)致电T,该计划将被安排在 n时间后唤醒,但 时间T + n

这通常是优选的,因为:

  • 时间通常不会倒退

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

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

或者设置一个过去的时间(比如说15秒),看看程序在15 + 2秒后恢复。

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

2016-08-25 16:27:12程序调用{​​{1}} Go运行时计划在2016-08-25 16:27:14唤醒goroutine并让goroutine进入睡眠状态

同时......

用户将系统时间设置为2016-08- 24 16:27:13

现在超时计划在一天后过期。

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