golang time.Sleep 错误?
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
调用 Sleep(n)
,程序将不会在 [=12] 之后唤醒=] 时间,但 在 时间 T + n
。
这通常是可取的,因为:
时间通常不会倒流
由于 OS 调度延迟,重复休眠的程序可能会无限期地落后于调度;使用绝对时间使其通过缩短睡眠时间间隔来补偿延迟。
对于您的情况,您只需等待一天程序即可再次开始打印。 :D
或者将时间设置得稍微过去一点(比如 15 秒),然后看到程序在 15+2 秒后恢复。
PS。举例说明会发生什么:
在 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 为纳秒
下面我做了测试代码(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
调用 Sleep(n)
,程序将不会在 [=12] 之后唤醒=] 时间,但 在 时间 T + n
。
这通常是可取的,因为:
时间通常不会倒流
由于 OS 调度延迟,重复休眠的程序可能会无限期地落后于调度;使用绝对时间使其通过缩短睡眠时间间隔来补偿延迟。
对于您的情况,您只需等待一天程序即可再次开始打印。 :D
或者将时间设置得稍微过去一点(比如 15 秒),然后看到程序在 15+2 秒后恢复。
PS。举例说明会发生什么:
在 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 为纳秒