Go定時器的三種實現(xiàn)方式示例詳解
Sleep
很多時候需要周期性的執(zhí)行某些操作,就需要用到定時器。定時器有三種思路。
本節(jié)源碼位置 github.com/golang-mini…
使用休眠,讓當(dāng)前Goroutine
休眠一定的時間來實現(xiàn)定時的效果,缺點是程序執(zhí)行速度不均勻,導(dǎo)致定時周期不均勻。
for{ fmt.Println(time.Now()) time.Sleep(time.Second*1) }
Timer
Go
語言的內(nèi)置包,指定一個時間開始計時,時間到之后會向外發(fā)送通知,發(fā)送通知的方式就是使用<-chan Time
返回內(nèi)容。
第一種方式,直接在需要等待處使用,效果和Sleep
一樣,一使用就卡在那了內(nèi)部就是使用了Timer
。
fmt.Println(time.Now()) <-time.After(1*time.Second) fmt.Println(time.Now())
也可以把他拆分開,在任意地方進(jìn)行等待
timer := time.NewTimer(1 * time.Second) <-timer.C fmt.Println(time.Now())
但是以上只是做到延遲一次性執(zhí)行,我們來改造一下,把他變成定時器。
done := make(chan struct{}) timer := time.NewTimer(1 * time.Second) go func() { for { select { case <-timer.C: fmt.Println(time.Now()) timer.Reset(1 * time.Second) case <-done: return } } }() <-time.After(5*time.Second + time.Millisecond*100) done <- struct{}{}
- 定義子
Goroutine
的目的是為了防止形成死鎖,讓定時器最終能退出,在實際項目中可能需要一個永久運(yùn)行的定時器,一般為了不影響項目主邏輯也會這樣定義。如果你的項目就是定時任務(wù),我建議也這么寫,這樣可以注冊很多個定時器互不影響。 done
是為了判斷執(zhí)行是否結(jié)束,防止主Goroutine
提前退出。- 這個示例只有兩個
case
,實戰(zhàn)中如果有加其他case
需要給每個case
內(nèi)都做一次Reset
,保證重置定時器。
Ticker
相比上述使用延遲執(zhí)行功能實現(xiàn)的定時器,Ticker
本身就是一個定時器(內(nèi)部封裝了Timer
),我們使用起來就非常簡單。
ticker := time.NewTicker(1 * time.Second) go func() { for { <-ticker.C fmt.Println(time.Now()) } }() <-time.After(5 * time.Second + time.Millisecond*100) ticker.Stop()
在select 一節(jié)中講述的官方超時控制方案非常的實用,也是使用的此函數(shù)。還使用到timer.Stop
和timer.Reset
這兩個內(nèi)置函數(shù)這里就不展開講解了,建議進(jìn)行復(fù)習(xí)。
小結(jié)
定時器一般用來周期性執(zhí)行任務(wù),比如定時同步數(shù)據(jù)、計算報表、發(fā)送通知。
time.Sleep
使用休眠,讓當(dāng)前goroutine
休眠一定的時間來實現(xiàn)定時的效果,缺點是內(nèi)部邏輯執(zhí)行的速度會影響到定時器的時間差,無法做到精確間隔。Timer
類似于Sleep
的延遲處理,通過channel
來獲得通知,也可以改造成定時器。因為是延遲處理,所以要記得重置時間來實現(xiàn)定時執(zhí)行的效果。Ticker
現(xiàn)成的定時器,內(nèi)部也是封裝了Timer
。
以上就是Go定時器的三種實現(xiàn)方式的詳細(xì)內(nèi)容,更多關(guān)于Go定時器實現(xiàn)方式的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
一鍵定位Golang線上服務(wù)內(nèi)存泄露的秘籍
內(nèi)存泄露?別讓它拖垮你的Golang線上服務(wù)!快速掌握Go語言服務(wù)內(nèi)存泄漏排查秘籍,從此問題無處遁形,一文讀懂如何精準(zhǔn)定位與有效解決Golang應(yīng)用中的內(nèi)存問題,立即閱讀,讓性能飛升!2024-01-01wind10 idea中 go 開發(fā)環(huán)境搭建教程圖解
這篇文章主要介紹了wind10 idea中 go 開發(fā)環(huán)境搭建過程,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-06-06golang 項目打包部署環(huán)境變量設(shè)置方法
最近將 golang 項目打包部署在不同環(huán)境,下面分享一下我的心得體會,對golang 項目打包部署環(huán)境變量設(shè)置方法感興趣的朋友一起看看吧2024-07-07