主頁(yè) > 知識(shí)庫(kù) > Go的固定時(shí)長(zhǎng)定時(shí)器和周期性時(shí)長(zhǎng)定時(shí)器

Go的固定時(shí)長(zhǎng)定時(shí)器和周期性時(shí)長(zhǎng)定時(shí)器

熱門(mén)標(biāo)簽:服務(wù)外包 AI電銷(xiāo) 地方門(mén)戶(hù)網(wǎng)站 鐵路電話系統(tǒng) Linux服務(wù)器 呼叫中心市場(chǎng)需求 百度競(jìng)價(jià)排名 網(wǎng)站排名優(yōu)化

我們之前要想在調(diào)度里面實(shí)現(xiàn)延時(shí)執(zhí)行,我們可以使用管道阻塞,直到有人往管道里面寫(xiě)東西才變通暢,還可以使用sleep來(lái)睡覺(jué),但是睡覺(jué)的過(guò)程,協(xié)程啥也干不了也占用資源。所以我們要用到接下來(lái)講的定時(shí)器,不會(huì)像sleep那樣睡的時(shí)候也占用資源。

先來(lái)看看下面這段代碼:

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í)間。

我們來(lái)看看這個(gè)

x := - timer.C

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

type Timer struct {
    C -chan Time
    r runtimeTimer
}

如果要描述一個(gè)單向的只寫(xiě)的管道,應(yīng)該這樣寫(xiě):

C chan - Time

但是如果要達(dá)到同樣的目的,我們可以使用下面這種更簡(jiǎn)單的方式:

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ā)才回收。 如果需要考慮效率,請(qǐng)改用 NewTimer 并在不再需要計(jì)時(shí)器時(shí)調(diào)用 Timer.Stop來(lái)結(jié)束。

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

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

剛才固定時(shí)長(zhǎng)定時(shí)器的就是一個(gè)定時(shí)炸彈設(shè)置為三秒鐘那三秒鐘之后就爆炸,現(xiàn)在我們看看周期性時(shí)長(zhǎng)定時(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)無(wú)法讀出數(shù)據(jù),
            //一定要讀會(huì)導(dǎo)致死鎖.
            ticker.Stop()
            break
        }
    }
    fmt.Println("計(jì)時(shí)結(jié)束")
}

這段代碼的意思是,設(shè)置一個(gè)周期性時(shí)長(zhǎng)定時(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í)長(zhǎng)定時(shí)器和周期性時(shí)長(zhǎng)定時(shí)器的文章就介紹到這了,更多相關(guān)Go 定時(shí)器 內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:
  • Golang定時(shí)器的2種實(shí)現(xiàn)方法與區(qū)別
  • golang定時(shí)器和超時(shí)的使用詳解
  • Golang 定時(shí)器(Timer 和 Ticker),這篇文章就夠了
  • Golang中定時(shí)器的陷阱詳解
  • 用golang實(shí)現(xiàn)一個(gè)定時(shí)器任務(wù)隊(duì)列實(shí)例
  • golang中定時(shí)器cpu使用率高的現(xiàn)象詳析
  • Go定時(shí)器cron的使用詳解
  • Go語(yǔ)言中定時(shí)器cron的基本使用教程
  • golang time包下定時(shí)器的實(shí)現(xiàn)方法
  • Go語(yǔ)言實(shí)現(xiàn)定時(shí)器的方法

標(biāo)簽:衡水 銅川 黃山 湘潭 仙桃 蘭州 湖南 崇左

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《Go的固定時(shí)長(zhǎng)定時(shí)器和周期性時(shí)長(zhǎng)定時(shí)器》,本文關(guān)鍵詞  ;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 收縮
    • 微信客服
    • 微信二維碼
    • 電話咨詢(xún)

    • 400-1100-266