go語(yǔ)言設(shè)置定時(shí)器的方法-創(chuàng)新互聯(lián)

小編給大家分享一下go語(yǔ)言設(shè)置定時(shí)器的方法,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

創(chuàng)新互聯(lián)長(zhǎng)期為千余家客戶提供的網(wǎng)站建設(shè)服務(wù),團(tuán)隊(duì)從業(yè)經(jīng)驗(yàn)10年,關(guān)注不同地域、不同群體,并針對(duì)不同對(duì)象提供差異化的產(chǎn)品和服務(wù);打造開放共贏平臺(tái),與合作伙伴共同營(yíng)造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為嘉祥企業(yè)提供專業(yè)的網(wǎng)站設(shè)計(jì)制作、網(wǎng)站設(shè)計(jì),嘉祥網(wǎng)站改版等技術(shù)服務(wù)。擁有十載豐富建站經(jīng)驗(yàn)和眾多成功案例,為您定制開發(fā)。

go語(yǔ)言設(shè)置定時(shí)器的方法:1、通過“time.NewTicker()”方法創(chuàng)建,其中ticker會(huì)按照設(shè)定的間隔時(shí)間觸發(fā);2、通過“time.NewTimer()”方法創(chuàng)建,其中timer只會(huì)執(zhí)行一詞;3、使用“After()”來創(chuàng)建。

Go語(yǔ)言中定時(shí)器的使用

GO語(yǔ)言在time包中提供了三種定時(shí)器的使用方式:

1.第一種:ticker

// A Ticker holds a channel that delivers `ticks' of a clock
// at intervals.
type Ticker struct {
	C <-chan Time // The channel on which the ticks are delivered.
	r runtimeTimer
}

通過time.NewTicker() 創(chuàng)建,這種類型,ticker會(huì)不斷的按照設(shè)定的間隔時(shí)間觸發(fā),除非主動(dòng)終止運(yùn)行。


2.第二種:timer

// The Timer type represents a single event.
// When the Timer expires, the current time will be sent on C,
// unless the Timer was created by AfterFunc.
// A Timer must be created with NewTimer or AfterFunc.
type Timer struct {
	C <-chan Time
	r runtimeTimer
}

通過 time.NewTimer() 創(chuàng)建,這種類型,timer只會(huì)執(zhí)行一次,當(dāng)然,可以在執(zhí)行完以后通過調(diào)用timer.Reset() 讓定時(shí)器再次工作,并可以更改時(shí)間間隔。


3.第三種:After()

// After waits for the duration to elapse and then sends the current time
// on the returned channel.
// It is equivalent to NewTimer(d).C.
// The underlying Timer is not recovered by the garbage collector
// until the timer fires. If efficiency is a concern, use NewTimer
// instead and call Timer.Stop if the timer is no longer needed.
func After(d Duration) <-chan Time {
	return NewTimer(d).C
}

從代碼可以看到,After()其實(shí)是Timer的一個(gè)語(yǔ)法糖。



下面通過代碼演示一下三種方式的使用:

1.Ticker

ticker := time.NewTicker(time.Second * 1) // 運(yùn)行時(shí)長(zhǎng)
    ch := make(chan int)
    go func() {
        var x int
        for x < 10 {
            select {
            case <-ticker.C:
                x++
                fmt.Printf("%d\n", x)
            }
        }
        ticker.Stop()
        ch <- 0
    }()
    <-ch                                    // 通過通道阻塞,讓任務(wù)可以執(zhí)行完指定的次數(shù)。

該ticker每1秒觸發(fā)一次,即ticker.C中每一秒會(huì)有一個(gè)內(nèi)容加入,最后通過向ch中寫入數(shù)字,讓程序解除阻塞,繼續(xù)執(zhí)行。

2.Timer

timer := time.NewTimer(time.Second * 1) // timer 只能按時(shí)觸發(fā)一次,可通過Reset()重置后繼續(xù)觸發(fā)。
    go func() {
        var x int
        for {
            select {
            case <-timer.C:
                x++
                fmt.Printf("%d,%s\n", x, time.Now().Format("2006-01-02 15:04:05"))
                if x < 10 {
                    timer.Reset(time.Second * 2)
                } else {
                    ch <- x
                }
            }
        }
    }()
    <-ch

3.After()

// 阻塞一下,等待主進(jìn)程結(jié)束
    tt := time.NewTimer(time.Second * 10)
    <-tt.C
    fmt.Println("over.")

    <-time.After(time.Second * 4)
    fmt.Println("再等待4秒退出。tt 沒有終止,打印出 over 后會(huì)看見在繼續(xù)執(zhí)行...")
    tt.Stop()
    <-time.After(time.Second * 2)
    fmt.Println("tt.Stop()后, tt 仍繼續(xù)執(zhí)行,只是關(guān)閉了 tt.C 通道。")

4.我們可以利用這些基本的方法,設(shè)計(jì)自己的定時(shí)任務(wù)管理。

type jobFunc2 func(j *job)

type job struct {
    jf     jobFunc2
    params map[string]interface{}
    ch     chan int
}

func NewJob() *job {
    return &job{
        params: make(map[string]interface{}),
        ch:     make(chan int),
    }
}

func (j *job) Run(t time.Duration) {
    ticker := time.NewTicker(time.Second * t)
    go func() {
        for {
            select {
            case <-ticker.C:
                j.jf(j)
            case <-j.ch:
                fmt.Println("收到結(jié)束指令")
                ticker.Stop()
                break
            }
        }
    }()

}

func main() {
    j := NewJob()
    j.jf = func(jj *job) {
        fmt.Println("定時(shí)任務(wù)執(zhí)行...", time.Now().Format("15:04:05 2006-02-01"), jj.params)
    }
    j.params["p1"] = "第一個(gè)參數(shù)"
    j.params["p2"] = 100
    j.Run(1)

    // 阻塞一下,等待主進(jìn)程結(jié)束
    tt := time.NewTimer(time.Second * 10)
    <-tt.C
    fmt.Println("over.")

    <-time.After(time.Second * 4)
    fmt.Println("再等待4秒退出。tt 沒有終止,打印出 over 后會(huì)看見在繼續(xù)執(zhí)行...")
    tt.Stop()
    <-time.After(time.Second * 2)
    fmt.Println("tt.Stop()后, tt 仍繼續(xù)執(zhí)行,只是關(guān)閉了 tt.C 通道。")
}

部分執(zhí)行結(jié)果截圖:

go語(yǔ)言設(shè)置定時(shí)器的方法

最后補(bǔ)充一下,通過channel去終止任務(wù)的執(zhí)行。

// 阻塞一下,等待主進(jìn)程結(jié)束
    tt := time.NewTimer(time.Second * 10)
    <-tt.C
    fmt.Println("over.")

    <-time.After(time.Second * 4)
    fmt.Println("再等待4秒退出。tt 沒有終止,打印出 over 后會(huì)看見在繼續(xù)執(zhí)行...")
    tt.Stop()
    <-time.After(time.Second * 2)
    fmt.Println("tt.Stop()后, tt 仍繼續(xù)執(zhí)行,只是關(guān)閉了 tt.C 通道。")
    j.ch <- 0
    <-time.After(time.Second * 2)
    fmt.Println("又等了2秒鐘...這兩秒鐘可以看到 tt 沒干活了...")

go語(yǔ)言設(shè)置定時(shí)器的方法


在GO語(yǔ)言編寫中,要熟練使用channel。

以上是“go語(yǔ)言設(shè)置定時(shí)器的方法”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!

文章題目:go語(yǔ)言設(shè)置定時(shí)器的方法-創(chuàng)新互聯(lián)
轉(zhuǎn)載注明:http://muchs.cn/article8/cedpop.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站排名做網(wǎng)站、微信小程序、移動(dòng)網(wǎng)站建設(shè)Google、搜索引擎優(yōu)化

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

綿陽(yáng)服務(wù)器托管