Go語言定時器Timer和Ticker的使用與區(qū)別
概述
在日常開發(fā)中,我們不可避免的需要使用到定時任務(wù)用來處理業(yè)務(wù)邏輯。在Go語言中內(nèi)置的有兩個定時器,Timer和Ticker,合理的使用這兩個定時器可以很好的解決定時任務(wù)的需求,同時除了這兩個內(nèi)置的定時器外,還有另外的三方庫也可以用來完成定時任務(wù)的需求。
Timer
簡介
Timer定時器可以在指定時間后執(zhí)行一次,使用time包中的NewTimer方法傳入間隔時間參數(shù)即可創(chuàng)建一個Timer定時器,定時器將會在指定的時間后執(zhí)行一次。
Timer中共有以下方法可調(diào)用
// 創(chuàng)建 func NewTimer(d Duration) *Timer // 重置 func (t *Timer) Reset(d Duration) bool // 停止 func (t *Timer) Stop() bool
在Timer中除了有以上方法之外,還有最重要的就是Timer中包含一個時間類型的通道C,當(dāng)指定時間間隔到達(dá)后,就會將當(dāng)前時間發(fā)送到通道C中,這樣我們可以使用select監(jiān)聽通道C即可完成在指定時間后執(zhí)行任務(wù)的需求。
基礎(chǔ)用法
我們根據(jù)上面的描述,完成了下面的代碼:
func main() { // 創(chuàng)建一個Timer定時器 timer := time.NewTimer(time.Second * 2) // 延遲關(guān)閉定時器 defer timer.Stop() fmt.Println("當(dāng)前時間:", time.Now()) select { // 使用select監(jiān)聽通道C case nowTime := <-timer.C: fmt.Println("間隔2秒后指定定時任務(wù),當(dāng)前時間:", nowTime) } }
在idea中運(yùn)行代碼后會輸出以下內(nèi)容:
當(dāng)前時間: 2024-06-30 15:12:08.7736065 +0800 CST m=+0.002108801
間隔2秒后指定定時任務(wù),當(dāng)前時間: 2024-06-30 15:12:10.7797079 +0800 CST m=+2.008210201Process finished with the exit code 0
可以看到,Timer定時器在指定時間后會執(zhí)行一次任務(wù),然后結(jié)束。
Reset使用
在上面的代碼中可以看到Timer在指定時間后僅能執(zhí)行一次任務(wù),但是我們可以使用Reset方法重置定時器,這樣的話可以在每次執(zhí)行任務(wù)后重置,用來達(dá)到每間隔指定時間都執(zhí)行一次任務(wù)的需求。
將代碼略做修改如下:
func main() { // 創(chuàng)建一個Timer定時器 timer := time.NewTimer(time.Second * 2) // 延遲關(guān)閉定時器 defer timer.Stop() fmt.Println("當(dāng)前時間:", time.Now()) for { timer.Reset(time.Second * 2) select { // 使用select監(jiān)聽通道C case nowTime := <-timer.C: fmt.Println("間隔2秒后指定定時任務(wù),當(dāng)前時間:", nowTime) } } }
在上面代碼中可以看到在每次的循環(huán)中都重置一次Timer定時器,這樣的話就可以實現(xiàn)每隔一段時間都執(zhí)行一次任務(wù)的需求。
最終運(yùn)行結(jié)果如下:
當(dāng)前時間: 2024-06-30 15:16:01.2907834 +0800 CST m=+0.002052801
間隔2秒后指定定時任務(wù),當(dāng)前時間: 2024-06-30 15:16:03.3096846 +0800 CST m=+2.020954001
間隔2秒后指定定時任務(wù),當(dāng)前時間: 2024-06-30 15:16:05.3236498 +0800 CST m=+4.034919201
間隔2秒后指定定時任務(wù),當(dāng)前時間: 2024-06-30 15:16:07.3318153 +0800 CST m=+6.043084701
間隔2秒后指定定時任務(wù),當(dāng)前時間: 2024-06-30 15:16:09.3462966 +0800 CST m=+8.057566001
間隔2秒后指定定時任務(wù),當(dāng)前時間: 2024-06-30 15:16:11.3504773 +0800 CST m=+10.061746701
……
Ticker
簡介
Ticker定時器的用法和Timer定時器的用法以及內(nèi)置的方法都一樣,區(qū)別在于Ticker不僅僅只執(zhí)行一次,而是會根據(jù)指定的時間間隔不停地執(zhí)行。
基礎(chǔ)用法
代碼如下:
func main() { ticker := time.NewTicker(time.Second * 2) defer ticker.Stop() fmt.Println("當(dāng)前時間:", time.Now()) for { select { case nowTime := <-ticker.C: fmt.Println("間隔2秒后指定定時任務(wù),當(dāng)前時間:", nowTime) } } }
根據(jù)Ticker寫出以上代碼,代碼會每隔2秒執(zhí)行一次,不需要像Timer中那樣每次使用Reset方法來重置定時器,最終運(yùn)行結(jié)果如下:
當(dāng)前時間: 2024-06-30 15:20:27.4070592 +0800 CST m=+0.002137901
間隔2秒后指定定時任務(wù),當(dāng)前時間: 2024-06-30 15:20:29.4083801 +0800 CST m=+2.003458801
間隔2秒后指定定時任務(wù),當(dāng)前時間: 2024-06-30 15:20:31.414517 +0800 CST m=+4.009595701
間隔2秒后指定定時任務(wù),當(dāng)前時間: 2024-06-30 15:20:33.4191099 +0800 CST m=+6.014188601
間隔2秒后指定定時任務(wù),當(dāng)前時間: 2024-06-30 15:20:35.4099723 +0800 CST m=+8.005051001
間隔2秒后指定定時任務(wù),當(dāng)前時間: 2024-06-30 15:20:37.4208446 +0800 CST m=+10.015923301
……
在Ticker定時器中同樣也有Reset方法,但是就算不調(diào)用Reset方法定時器也會一直執(zhí)行,所以這里的Reset方法可以用來重置定時器的間隔時間。
區(qū)別
- Ticker定時器表示每隔一段時間就執(zhí)行一次,一般可執(zhí)行多次。
- Timer定時器表示在一段時間后執(zhí)行,默認(rèn)情況下只執(zhí)行一次,如果想再次執(zhí)行的話,每次都需要調(diào)用Reset方法,此時效果類似Ticker定時器。同時也可以調(diào)用Stop方法取消定時器。
到此這篇關(guān)于Go語言定時器Timer和Ticker的使用與區(qū)別的文章就介紹到這了,更多相關(guān)Go語言定時器Timer和Ticker內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
go語言通過反射創(chuàng)建結(jié)構(gòu)體、賦值、并調(diào)用對應(yīng)的操作
這篇文章主要介紹了go語言通過反射創(chuàng)建結(jié)構(gòu)體、賦值、并調(diào)用對應(yīng)的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-05-05vscode 通過Go:Install/Update Tools命令安裝失敗的問題解決
本文介紹了在VSCode開發(fā)環(huán)境中通過Go:Install/UpdateTools命令安裝工具時遇到網(wǎng)絡(luò)問題的解決方法,具有一定的參考價值,感興趣的可以了解一下2024-12-12golang gorm 計算字段和獲取sum()值的實現(xiàn)
這篇文章主要介紹了golang gorm 計算字段和獲取sum()值的實現(xiàn)操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-12-12go?打包運(yùn)行文件在windows,liunx運(yùn)行
這篇文章主要介紹了go?打包運(yùn)行文件在windows,liunx運(yùn)行的相關(guān)資料,需要的朋友可以參考下2023-11-11