亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Go語言定時器Timer和Ticker的使用與區(qū)別

 更新時間:2024年07月24日 09:47:08   作者:CodeJR  
在Go語言中內(nèi)置的有兩個定時器,Timer和Ticker,本文主要介紹了Go語言定時器Timer和Ticker的使用與區(qū)別,具有一定的參考價值,感興趣的可以了解一下

概述

在日常開發(fā)中,我們不可避免的需要使用到定時任務(wù)用來處理業(yè)務(wù)邏輯。在Go語言中內(nèi)置的有兩個定時器,Timer和Ticker,合理的使用這兩個定時器可以很好的解決定時任務(wù)的需求,同時除了這兩個內(nèi)置的定時器外,還有另外的三方庫也可以用來完成定時任務(wù)的需求。

Timer

簡介

Timer定時器可以在指定時間后執(zhí)行一次,使用time包中的NewTimer方法傳入間隔時間參數(shù)即可創(chuàng)建一個Timer定時器,定時器將會在指定的時間后執(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中包含一個時間類型的通道C,當(dāng)指定時間間隔到達(dá)后,就會將當(dāng)前時間發(fā)送到通道C中,這樣我們可以使用select監(jiān)聽通道C即可完成在指定時間后執(zhí)行任務(wù)的需求。

基礎(chǔ)用法

我們根據(jù)上面的描述,完成了下面的代碼:

func main() {
    // 創(chuàng)建一個Timer定時器
    timer := time.NewTimer(time.Second * 2)
    // 延遲關(guān)閉定時器
    defer timer.Stop()
    fmt.Println("當(dāng)前時間:", time.Now())
    select {
        // 使用select監(jiān)聽通道C
        case nowTime := <-timer.C:
        fmt.Println("間隔2秒后指定定時任務(wù),當(dāng)前時間:", nowTime)
    }
}

在idea中運(yùn)行代碼后會輸出以下內(nèi)容:

當(dāng)前時間: 2024-06-30 15:12:08.7736065 +0800 CST m=+0.002108801
間隔2秒后指定定時任務(wù),當(dāng)前時間: 2024-06-30 15:12:10.7797079 +0800 CST m=+2.008210201

Process finished with the exit code 0

可以看到,Timer定時器在指定時間后會執(zhí)行一次任務(wù),然后結(jié)束。

Reset使用

在上面的代碼中可以看到Timer在指定時間后僅能執(zhí)行一次任務(wù),但是我們可以使用Reset方法重置定時器,這樣的話可以在每次執(zhí)行任務(wù)后重置,用來達(dá)到每間隔指定時間都執(zhí)行一次任務(wù)的需求。

將代碼略做修改如下:

func main() {
    // 創(chuàng)建一個Timer定時器
    timer := time.NewTimer(time.Second * 2)
    // 延遲關(guān)閉定時器
    defer timer.Stop()
    fmt.Println("當(dāng)前時間:", time.Now())
    for {
        timer.Reset(time.Second * 2)
        select {
        // 使用select監(jiān)聽通道C
        case nowTime := <-timer.C:
            fmt.Println("間隔2秒后指定定時任務(wù),當(dāng)前時間:", nowTime)
        }
    }
}

在上面代碼中可以看到在每次的循環(huán)中都重置一次Timer定時器,這樣的話就可以實現(xiàn)每隔一段時間都執(zhí)行一次任務(wù)的需求。

最終運(yùn)行結(jié)果如下:

當(dāng)前時間: 2024-06-30 15:16:01.2907834 +0800 CST m=+0.002052801
間隔2秒后指定定時任務(wù),當(dāng)前時間: 2024-06-30 15:16:03.3096846 +0800 CST m=+2.020954001
間隔2秒后指定定時任務(wù),當(dāng)前時間: 2024-06-30 15:16:05.3236498 +0800 CST m=+4.034919201
間隔2秒后指定定時任務(wù),當(dāng)前時間: 2024-06-30 15:16:07.3318153 +0800 CST m=+6.043084701
間隔2秒后指定定時任務(wù),當(dāng)前時間: 2024-06-30 15:16:09.3462966 +0800 CST m=+8.057566001
間隔2秒后指定定時任務(wù),當(dāng)前時間: 2024-06-30 15:16:11.3504773 +0800 CST m=+10.061746701
……

Ticker

簡介

Ticker定時器的用法和Timer定時器的用法以及內(nèi)置的方法都一樣,區(qū)別在于Ticker不僅僅只執(zhí)行一次,而是會根據(jù)指定的時間間隔不停地執(zhí)行。

基礎(chǔ)用法

代碼如下:

func main() {
    ticker := time.NewTicker(time.Second * 2)
    defer ticker.Stop()
    fmt.Println("當(dāng)前時間:", time.Now())
    for {
        select {
        case nowTime := <-ticker.C:
            fmt.Println("間隔2秒后指定定時任務(wù),當(dāng)前時間:", nowTime)
        }
    }
}

根據(jù)Ticker寫出以上代碼,代碼會每隔2秒執(zhí)行一次,不需要像Timer中那樣每次使用Reset方法來重置定時器,最終運(yùn)行結(jié)果如下:

當(dāng)前時間: 2024-06-30 15:20:27.4070592 +0800 CST m=+0.002137901
間隔2秒后指定定時任務(wù),當(dāng)前時間: 2024-06-30 15:20:29.4083801 +0800 CST m=+2.003458801
間隔2秒后指定定時任務(wù),當(dāng)前時間: 2024-06-30 15:20:31.414517 +0800 CST m=+4.009595701
間隔2秒后指定定時任務(wù),當(dāng)前時間: 2024-06-30 15:20:33.4191099 +0800 CST m=+6.014188601
間隔2秒后指定定時任務(wù),當(dāng)前時間: 2024-06-30 15:20:35.4099723 +0800 CST m=+8.005051001
間隔2秒后指定定時任務(wù),當(dāng)前時間: 2024-06-30 15:20:37.4208446 +0800 CST m=+10.015923301
……

在Ticker定時器中同樣也有Reset方法,但是就算不調(diào)用Reset方法定時器也會一直執(zhí)行,所以這里的Reset方法可以用來重置定時器的間隔時間。

區(qū)別

  • Ticker定時器表示每隔一段時間就執(zhí)行一次,一般可執(zhí)行多次。
  • Timer定時器表示在一段時間后執(zhí)行,默認(rèn)情況下只執(zhí)行一次,如果想再次執(zhí)行的話,每次都需要調(diào)用Reset方法,此時效果類似Ticker定時器。同時也可以調(diào)用Stop方法取消定時器。

到此這篇關(guān)于Go語言定時器Timer和Ticker的使用與區(qū)別的文章就介紹到這了,更多相關(guān)Go語言定時器Timer和Ticker內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家! 

相關(guān)文章

最新評論