go語言中Timer和Ticker兩種計時器的使用
介紹
go語言中有Timer和Ticker這樣的兩種計時器,兩種計時器分別實現(xiàn)了不同的計時功能。
- Timer是單次時間事件,指在指定的單次時間過后觸發(fā),然后向自己channel中發(fā)送當(dāng)時時間,此后Timer不再計時。
- Ticker是多次時間事件,指每隔一段事件都觸發(fā)一次,并向自己channel發(fā)送當(dāng)前時間。
- 類似于javascript中的setTimeout()和setInterval()兩種計時器。
Timer計時及其方法
type Timer struct { C <-chan Time // 內(nèi)含隱藏或非導(dǎo)出字段 }
Timer類型代表單次時間事件。當(dāng)Timer到期時,當(dāng)時的時間會被發(fā)送給C。
NewTimer
func NewTimer(d Duration) *Timer
NewTimer創(chuàng)建一個Timer,它會在最少過去時間段d后到期,向其自身的C字段發(fā)送當(dāng)時的時間。
使用:
package main import ( "fmt" "time" ) func main() { timer := time.NewTimer(10 * time.Second) t1 := time.Now() fmt.Printf("t1:%v\n", t1) t2 := <-timer.C fmt.Printf("t2:%v\n", t2) }
輸出:
t1:2023-04-29 22:13:20.3142549 +0800 CST m=+0.002562901
t2:2023-04-29 22:13:30.328093 +0800 CST m=+10.016401001
程序輸出t1后,又計時了10秒輸出了t2
Stop
func (t *Timer) Stop() bool
Stop停止Timer的執(zhí)行。如果停止了t會返回真;如果t已經(jīng)被停止或者過期了會返回假。Stop不會關(guān)閉通道t.C,以避免從該通道的讀取不正確的成功。
使用:
package main import ( "fmt" "time" ) func main() { timer := time.NewTimer(10 * time.Second) t1 := time.Now() fmt.Printf("t1:%v\n", t1) //停止計時器 timer.Stop() t2 := time.Now() fmt.Printf("t2:%v\n", t2) t3 := <-timer.C fmt.Printf("t3:%v\n", t3) }
輸出:
t1:2023-04-29 22:25:05.921852 +0800 CST m=+0.002725901
t2:2023-04-29 22:25:05.9372012 +0800 CST m=+0.018075101
fatal error: all goroutines are asleep - deadlock!
可見,程序在timer使用了stop方法以后輸出t3就報出了all goroutines are asleep - deadlock! 錯誤。
Reset
func (t *Timer) Reset(d Duration) bool
Reset使t重新開始計時,(本方法返回后再)等待時間段d過去后到期。如果調(diào)用時t還在等待中會返回真;如果t已經(jīng)到期或者被停止了會返回假。
使用:
package main import ( "fmt" "time" ) func main() { timer := time.NewTimer(10 * time.Second) t1 := time.Now() fmt.Printf("t1:%v\n", t1) //程序休眠2s time.Sleep(2 * time.Second) //重新設(shè)置時間間隔 timer.Reset(15 * time.Second) t2 := time.Now() fmt.Printf("t2:%v\n", t2) t3 := <-timer.C fmt.Printf("t3:%v\n", t3) }
輸出:
t1:2023-04-29 22:33:53.4179209 +0800 CST m=+0.002563001
t2:2023-04-29 22:33:55.4452012 +0800 CST m=+2.029843301
t3:2023-04-29 22:34:10.4605181 +0800 CST m=+17.045160201
計時器被重新設(shè)置后會根據(jù)設(shè)置的時間段重新計時,到時間后,計時結(jié)束,向其自身的C字段發(fā)送當(dāng)時的時間。
Ticker計時及其方法
type Ticker struct { C <-chan Time // 周期性傳遞時間信息的通道 // 內(nèi)含隱藏或非導(dǎo)出字段 }
Ticker保管一個通道,并每隔一段時間向其傳遞"tick"。
NewTicker
func NewTicker(d Duration) *Ticker
NewTicker返回一個新的Ticker,該Ticker包含一個通道字段,并會每隔時間段d就向該通道發(fā)送當(dāng)時的時間。它會調(diào)整時間間隔或者丟棄tick信息以適應(yīng)反應(yīng)慢的接收者。如果d<=0會panic。關(guān)閉該Ticker可以釋放相關(guān)資源。
func (t *Ticker) Stop()
Stop關(guān)閉一個Ticker。在關(guān)閉后,將不會發(fā)送更多的tick信息。Stop不會關(guān)閉通道t.C,以避免從該通道的讀取不正確的成功。
使用:
package main import ( "fmt" "time" ) func main() { ticker := time.NewTicker(1 * time.Second) a := 10 for { <-ticker.C fmt.Println("a:", a) a-- if a == 0 { ticker.Stop() break } } }
輸出;
i: 10
i: 9
i: 8
i: 7
i: 6
i: 5
i: 4
i: 3
i: 2
i: 1
可見,程序中,每隔設(shè)置的1s時間就觸發(fā)一次定時器,并且向自帶的channel C中傳遞當(dāng)時時間。
到此這篇關(guān)于go語言中Timer和Ticker兩種計時器的使用的文章就介紹到這了,更多相關(guān)go語言 Timer和Ticker內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Go語言中TCP/IP網(wǎng)絡(luò)編程的深入講解
這篇文章主要給大家介紹了關(guān)于Go語言中TCP/IP網(wǎng)絡(luò)編程的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2018-05-05