您好,登錄后才能下訂單哦!
這篇文章主要介紹Go中如何實現固定時長定時器和周期性時長定時器,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!
先來看看下面這段代碼:
package main import ( "fmt" "time" ) func main() { timer := time.NewTimer(3 * time.Second) fmt.Println("定時器創建完畢!") fmt.Println(time.Now()) //阻塞3秒后才能讀出時間 x := <- timer.C //這個C是一個單向的只讀管道 fmt.Println(x) }
運行結果是這樣的:
定時器創建完畢!
2021-08-24 14:02:28.6664158 +0800 CST m=+0.012997601
2021-08-24 14:02:31.670071 +0800 CST m=+3.016652801
我們可以看到,運行結果和我們要達到的目的基本一致,三秒的定時器創建完畢后,阻塞三秒后才能讀出時間。
我們來看看這個
x := <- timer.C
根據下面這段代碼可知,這個C是一個單向的只讀管道:
type Timer struct { C <-chan Time r runtimeTimer }
如果要描述一個單向的只寫的管道,應該這樣寫:
C chan <- Time
但是如果要達到同樣的目的,我們可以使用下面這種更簡單的方式:
func main() { fmt.Println(time.Now()) x := <- time.After(3*time.Second) fmt.Println(x) }
使用time.After()等待規定的一段時間,然后就在返回的管道上發送當前時間。它相當于 NewTimer(d).C。垃圾收集器不會回收底層的 Timer,直到計時器觸發才回收。 如果需要考慮效率,請改用 NewTimer 并在不再需要計時器時調用 Timer.Stop來結束。
當然我們也可以使用下面這種方法,兩種方法都可以:
x := <- time.NewTimer(3 * time.Second).C
剛才固定時長定時器的就是一個定時炸彈設置為三秒鐘那三秒鐘之后就爆炸,現在我們看看周期性時長定時器吧!
func main() { ticker := time.NewTicker(1 * time.Second) var i int for{ x := <- ticker.C fmt.Print("\r",x) i++ if i>3{ //停掉秒表會導致ticker.C永遠無法讀出數據, //一定要讀會導致死鎖. ticker.Stop() break } } fmt.Println("計時結束") }
這段代碼的意思是,設置一個周期性時長定時器,然后每一秒從管道內讀一次數據,然后輸出直到i>3,就使用ticker.Stop()將定時器結束,然后停止循環,然后告訴你計時結束。
如果將定時器結束后,你仍然要堅持讀,就會出現下面這種情況!
fatal error: all goroutines are asleep - deadlock!
出現死鎖!所以這里需要用到break.
以上是“Go中如何實現固定時長定時器和周期性時長定時器”這篇文章的所有內容,感謝各位的閱讀!希望分享的內容對大家有幫助,更多相關知識,歡迎關注億速云行業資訊頻道!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。