猿问

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 最新版本。谢谢你。


胡说叔叔
浏览 149回答 2
2回答

开心每一天1111

内部睡眠是用绝对时间完成的:如果你Sleep(n)在 time调用,T程序被安排不会在 ntime之后醒来,而是在time 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- 24 16点27分13秒现在超时计划在一天零一秒后到期。这不应该发生在 Go 使用 POSIX CLOCK_MONOTONIC 或等效的系统上。

墨色风雨

time.Sleep(20_000_000_000) n 是纳秒
随时随地看视频慕课网APP

相关分类

Go
我要回答