溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Go中如何實(shí)現(xiàn)固定時(shí)長定時(shí)器和周期性時(shí)長定時(shí)器

發(fā)布時(shí)間:2021-08-29 08:25:48 來源:億速云 閱讀:208 作者:小新 欄目:開發(fā)技術(shù)

這篇文章主要介紹Go中如何實(shí)現(xiàn)固定時(shí)長定時(shí)器和周期性時(shí)長定時(shí)器,文中介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們一定要看完!

先來看看下面這段代碼:

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
    //這個C是一個單向的只讀管道
    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í)間。

我們來看看這個

x := <- timer.C

根據(jù)下面這段代碼可知,這個C是一個單向的只讀管道:

type Timer struct {
    C <-chan Time
    r runtimeTimer
}

如果要描述一個單向的只寫的管道,應(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。垃圾收集器不會回收底層的 Timer,直到計(jì)時(shí)器觸發(fā)才回收。 如果需要考慮效率,請改用 NewTimer 并在不再需要計(jì)時(shí)器時(shí)調(diào)用 Timer.Stop來結(jié)束。

當(dāng)然我們也可以使用下面這種方法,兩種方法都可以:

x := <- time.NewTimer(3 * time.Second).C

剛才固定時(shí)長定時(shí)器的就是一個定時(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{
            //停掉秒表會導(dǎo)致ticker.C永遠(yuǎn)無法讀出數(shù)據(jù),
            //一定要讀會導(dǎo)致死鎖.
            ticker.Stop()
            break
        }
    }
    fmt.Println("計(jì)時(shí)結(jié)束")
}

這段代碼的意思是,設(shè)置一個周期性時(shí)長定時(shí)器,然后每一秒從管道內(nèi)讀一次數(shù)據(jù),然后輸出直到i>3,就使用ticker.Stop()將定時(shí)器結(jié)束,然后停止循環(huán),然后告訴你計(jì)時(shí)結(jié)束。

如果將定時(shí)器結(jié)束后,你仍然要堅(jiān)持讀,就會出現(xiàn)下面這種情況!

fatal error: all goroutines are asleep - deadlock!

出現(xiàn)死鎖!所以這里需要用到break.

以上是“Go中如何實(shí)現(xiàn)固定時(shí)長定時(shí)器和周期性時(shí)長定時(shí)器”這篇文章的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對大家有幫助,更多相關(guān)知識,歡迎關(guān)注億速云行業(yè)資訊頻道!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

go
AI