代碼:
func main() {
fmt.Println(time.Now())
ticker := time.NewTicker(100 * time.Millisecond)
done := make(chan bool)
go func() {
time.Sleep(900 * time.Millisecond)
for {
select {
case <-done:
return
case t := <-ticker.C:
fmt.Println("Tick at", t)
}
}
}()
time.Sleep(1600 * time.Millisecond)
ticker.Stop()
done <- true
fmt.Println("Ticker stopped")
}
輸出:
2021-12-15 17:00:44.2506052 0800 08 m= 0.002777301
Tick at 2021-12-15 17:00:44.3916764 0800 08 m= 0.143848501
Tick at 2021-12-15 17:00:45.2913066 0800 08 m= 1.043478701
Tick at 2021-12-15 17:00:45.4007827 0800 08 m= 1.152954801
Tick at 2021-12-15 17:00:45.4930864 0800 08 m= 1.245258501
Tick at 2021-12-15 17:00:45.6021253 0800 08 m= 1.354297401
Tick at 2021-12-15 17:00:45.6980372 0800 08 m= 1.450209301
Tick at 2021-12-15 17:00:45.7929148 0800 08 m= 1.545086901
Tick at 2021-12-15 17:00:45.901921 0800 08 m= 1.654093101
Ticker stopped
問題:我如何解釋結果?進一步來說:
- 為什么goroutine中的sleep會暫停ticker,而mainroutine中的sleep則不會?
- ticker.C 是非緩沖所以沒有 16 個滴答聲嗎?
- 為什么第一個刻度有 m= 0.143848501?
uj5u.com熱心網友回復:
- goruotine 中的睡眠不會暫停股票代碼,它會延遲第一次列印值的時刻。
- ticker.C 的緩沖區為 1。根據代碼中的注釋:
// Give the channel a 1-element time buffer.
// If the client falls behind while reading, we drop ticks
// on the floor until the client catches up.
所以那里只有一個緩沖值。
- 第一個滴答大約在股票持續時間第一次過去約 100 毫秒的那一刻寫入通道。然后跳過其他滴答聲,因為ticker.C 中的緩沖區已滿并被丟棄,直到通道在 time.Sleep 之后解除阻塞,因此我們有大約 900 毫秒的跳躍。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/382669.html
下一篇:執行緒池無法處理大量任務
