Go的固定時(shí)長定時(shí)器和周期性時(shí)長定時(shí)器
我們之前要想在調(diào)度里面實(shí)現(xiàn)延時(shí)執(zhí)行,我們可以使用管道阻塞,直到有人往管道里面寫東西才變通暢,還可以使用sleep來睡覺,但是睡覺的過程,協(xié)程啥也干不了也占用資源。所以我們要用到接下來講的定時(shí)器,不會(huì)像sleep那樣睡的時(shí)候也占用資源。
先來看看下面這段代碼:
package main import ( "fmt" "time" ) func main() { timer := time.NewTimer(3 * time.Second) fmt.Println("定時(shí)器創(chuàng)建完畢!") fmt.Println(time.Now()) //阻塞3秒后才能讀出時(shí)間 x := <- timer.C //這個(gè)C是一個(gè)單向的只讀管道 fmt.Println(x) }
運(yùn)行結(jié)果是這樣的:
定時(shí)器創(chuàng)建完畢!
2021-08-24 14:02:28.6664158 +0800 CST m=+0.012997601
2021-08-24 14:02:31.670071 +0800 CST m=+3.016652801
我們可以看到,運(yùn)行結(jié)果和我們要達(dá)到的目的基本一致,三秒的定時(shí)器創(chuàng)建完畢后,阻塞三秒后才能讀出時(shí)間。
我們來看看這個(gè)
x := <- timer.C
根據(jù)下面這段代碼可知,這個(gè)C是一個(gè)單向的只讀管道:
type Timer struct { C <-chan Time r runtimeTimer }
如果要描述一個(gè)單向的只寫的管道,應(yīng)該這樣寫:
C chan <- Time
但是如果要達(dá)到同樣的目的,我們可以使用下面這種更簡單的方式:
func main() { fmt.Println(time.Now()) x := <- time.After(3*time.Second) fmt.Println(x) }
使用time.After()等待規(guī)定的一段時(shí)間,然后就在返回的管道上發(fā)送當(dāng)前時(shí)間。它相當(dāng)于 NewTimer(d).C。垃圾收集器不會(huì)回收底層的 Timer,直到計(jì)時(shí)器觸發(fā)才回收。 如果需要考慮效率,請改用 NewTimer 并在不再需要計(jì)時(shí)器時(shí)調(diào)用 Timer.Stop來結(jié)束。
當(dāng)然我們也可以使用下面這種方法,兩種方法都可以:
x := <- time.NewTimer(3 * time.Second).C
剛才固定時(shí)長定時(shí)器的就是一個(gè)定時(shí)炸彈設(shè)置為三秒鐘那三秒鐘之后就爆炸,現(xiàn)在我們看看周期性時(shí)長定時(shí)器吧!
func main() { ticker := time.NewTicker(1 * time.Second) var i int for{ x := <- ticker.C fmt.Print("\r",x) i++ if i>3{ //停掉秒表會(huì)導(dǎo)致ticker.C永遠(yuǎn)無法讀出數(shù)據(jù), //一定要讀會(huì)導(dǎo)致死鎖. ticker.Stop() break } } fmt.Println("計(jì)時(shí)結(jié)束") }
這段代碼的意思是,設(shè)置一個(gè)周期性時(shí)長定時(shí)器,然后每一秒從管道內(nèi)讀一次數(shù)據(jù),然后輸出直到i>3,就使用ticker.Stop()將定時(shí)器結(jié)束,然后停止循環(huán),然后告訴你計(jì)時(shí)結(jié)束。
如果將定時(shí)器結(jié)束后,你仍然要堅(jiān)持讀,就會(huì)出現(xiàn)下面這種情況!
fatal error: all goroutines are asleep - deadlock!
出現(xiàn)死鎖!所以這里需要用到break.
到此這篇關(guān)于談?wù)凣o的固定時(shí)長定時(shí)器和周期性時(shí)長定時(shí)器的文章就介紹到這了,更多相關(guān)Go 定時(shí)器 內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Go基礎(chǔ)教程系列之回調(diào)函數(shù)和閉包詳解
這篇文章主要介紹了Go基礎(chǔ)教程系列之回調(diào)函數(shù)和閉包詳解,需要的朋友可以參考下2022-04-04go語言通過反射創(chuàng)建結(jié)構(gòu)體、賦值、并調(diào)用對應(yīng)的操作
這篇文章主要介紹了go語言通過反射創(chuàng)建結(jié)構(gòu)體、賦值、并調(diào)用對應(yīng)的操作,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-05-05