我在下面制作測試代碼(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
程序被安排不會在 n
time之后醒來,而是在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 或等效的系統上。
- 2 回答
- 0 關注
- 166 瀏覽
添加回答
舉報
0/150
提交
取消