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