为了账号安全,请及时绑定邮箱和手机立即绑定

golang time.Sleep bug?

golang time.Sleep bug?

Go
胡说叔叔 2021-10-25 18:29:38
我在下面制作测试代码(gotest.go)package mainimport (    "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 最新版本。谢谢你。
查看完整描述

2 回答

?
开心每一天1111

TA贡献1836条经验 获得超13个赞

内部睡眠是用绝对时间完成的:如果你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 或等效的系统上。


查看完整回答
反对 回复 2021-10-25
?
墨色风雨

TA贡献1853条经验 获得超6个赞

time.Sleep(20_000_000_000) n 是纳秒


查看完整回答
反对 回复 2021-10-25
  • 2 回答
  • 0 关注
  • 148 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信