golang time.Sleep bug?

前端之家收集整理的这篇文章主要介绍了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调用睡眠(n),程序被安排在n次之后不被唤醒,而是在时间T n.

这通常是优选的,因为:

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

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

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

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

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

同时……

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

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

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

猜你在找的Go相关文章