Golang定時(shí)器的2種實(shí)現(xiàn)方法與區(qū)別
不得不說,golang的sdk做了太多的東西,定時(shí)器在golang里實(shí)現(xiàn)起來非常的簡單
兩種方式
- NewTicker()
- NewTimer()
代碼如下
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)
// 清理計(jì)時(shí)器
defer ticker.Stop()
for {
fmt.Println("ticker start ", time.Now().Format("15:04:05"))
foo()
<-ticker.C
}
}
運(yùn)行結(jié)果
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)
// 清理計(jì)時(shí)器
defer timer.Stop()
for {
fmt.Println("ticker start ", time.Now().Format("15:04:05"))
foo()
<-timer.C
}
}
運(yùn)行結(jié)果

可以看到,就執(zhí)行了兩次就不動(dòng)了
原因:NewTicker() 啟動(dòng)后,會(huì)自己維護(hù)一個(gè)過期時(shí)間的通道(Channel)也就是代碼里的 <-ticker.C 這句意思就是時(shí)間一到,ticker會(huì)通過管道發(fā)出一個(gè)信號(hào)給CPU,告訴CPU時(shí)間到了,該執(zhí)行定時(shí)里的方法了,信號(hào)發(fā)出后,ticker會(huì)自動(dòng)的重置定時(shí)的剩余時(shí)間,然后再進(jìn)行下一輪的發(fā)送信號(hào)執(zhí)行方法
但NewTimer()看源碼會(huì)發(fā)現(xiàn),它在sleep.go文件里定義的,也就是說NewTimer()相當(dāng)于一個(gè)睡眠(延時(shí)執(zhí)行)。時(shí)間一到,timer會(huì)通過管道發(fā)出一個(gè)信號(hào)告訴CPU該執(zhí)行定時(shí)里的代碼了,然后這個(gè)管道就銷毀了,除非使用 timer.Reset(time.Duration * 2) 來重新激活這根管道,讓它重置定時(shí)的剩余時(shí)間,到下一輪定信號(hào)發(fā)出后,還要再次重置
所以在用定時(shí)時(shí),還是NewTicker()方便
值得一提的是,當(dāng)定時(shí)任務(wù)執(zhí)行時(shí)間過長且超過定時(shí)的間隔時(shí)間時(shí),定時(shí)的間隔時(shí)間到了之后會(huì)等待定時(shí)任務(wù)執(zhí)行完才會(huì)進(jìn)行下一輪的定時(shí)任務(wù)
總結(jié)
到此這篇關(guān)于Golang定時(shí)器的2種實(shí)現(xiàn)方法與區(qū)別的文章就介紹到這了,更多相關(guān)Golang定時(shí)器實(shí)現(xiàn)與區(qū)別內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
關(guān)于go get 下載第三方包存儲(chǔ)路徑問題
這篇文章主要介紹了關(guān)于go get 下載第三方包存儲(chǔ)路徑問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-01-01
golang使用net/rpc庫實(shí)現(xiàn)rpc
這篇文章主要為大家詳細(xì)介紹了golang如何使用net/rpc庫實(shí)現(xiàn)rpc,文章的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,需要的小伙伴可以參考一下2024-01-01
golang使用go mod導(dǎo)入本地包和第三方包的方式
這篇文章主要介紹了golang使用go mod導(dǎo)入本地包和第三方包的方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-01-01
GO?CountMinSketch計(jì)數(shù)器(布隆過濾器思想的近似計(jì)數(shù)器)
這篇文章主要介紹了GO?CountMinSketch計(jì)數(shù)器(布隆過濾器思想的近似計(jì)數(shù)器),文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的朋友可以參考一下2022-09-09
詳解Golang time包中的結(jié)構(gòu)體time.Ticker
在日常開發(fā)過程中,會(huì)頻繁遇到對(duì)時(shí)間進(jìn)行操作的場(chǎng)景,使用 Golang 中的 time 包可以很方便地實(shí)現(xiàn)對(duì)時(shí)間的相關(guān)操作,接下來的幾篇文章會(huì)詳細(xì)講解 time 包,本文講解一下 time 包中的結(jié)構(gòu)體 time.Ticker,需要的朋友可以參考下2023-08-08
go?REST?API設(shè)計(jì)模式和反模式示例解析
在這篇文章中,我們將探討一些常見的REST?API設(shè)計(jì)模式和開發(fā)者應(yīng)該注意的反模式,我們還將提供Golang和Open?API?Schema的代碼片段來幫助說明這些概念,有需要的朋友可以借鑒參考下2023-09-09

