不得不說,golang的sdk做了太多的東西,定時器在golang里實現起來非常的簡單
兩種方式
代碼如下
NewTicker() 方式
func foo() {
fmt.Println("foo() start.")
time.Sleep(time.Second * 3)
fmt.Println("foo() end.")
}
func TestTicker(t *testing.T) {
ticker := time.NewTicker(time.Second * 2)
// 清理計時器
defer ticker.Stop()
for {
fmt.Println("ticker start ", time.Now().Format("15:04:05"))
foo()
-ticker.C
}
}
運行結果
NewTimer() 方式
func foo() {
fmt.Println("foo() start.")
time.Sleep(time.Second * 3)
fmt.Println("foo() end.")
}
func TestTimer(t *testing.T) {
timer := time.NewTimer(time.Second * 2)
// 清理計時器
defer timer.Stop()
for {
fmt.Println("ticker start ", time.Now().Format("15:04:05"))
foo()
-timer.C
}
}
運行結果

可以看到,就執行了兩次就不動了
原因:NewTicker() 啟動后,會自己維護一個過期時間的通道(Channel)也就是代碼里的 -ticker.C 這句意思就是時間一到,ticker會通過管道發出一個信號給CPU,告訴CPU時間到了,該執行定時里的方法了,信號發出后,ticker會自動的重置定時的剩余時間,然后再進行下一輪的發送信號執行方法
但NewTimer()看源碼會發現,它在sleep.go文件里定義的,也就是說NewTimer()相當于一個睡眠(延時執行)。時間一到,timer會通過管道發出一個信號告訴CPU該執行定時里的代碼了,然后這個管道就銷毀了,除非使用 timer.Reset(time.Duration * 2) 來重新激活這根管道,讓它重置定時的剩余時間,到下一輪定信號發出后,還要再次重置
所以在用定時時,還是NewTicker()方便
值得一提的是,當定時任務執行時間過長且超過定時的間隔時間時,定時的間隔時間到了之后會等待定時任務執行完才會進行下一輪的定時任務
總結
到此這篇關于Golang定時器的2種實現方法與區別的文章就介紹到這了,更多相關Golang定時器實現與區別內容請搜索腳本之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持腳本之家!
您可能感興趣的文章:- golang定時器和超時的使用詳解
- Golang 定時器(Timer 和 Ticker),這篇文章就夠了
- Golang中定時器的陷阱詳解
- 用golang實現一個定時器任務隊列實例
- golang中定時器cpu使用率高的現象詳析
- golang time包下定時器的實現方法
- Golang 定時器的終止與重置實現