小編給大家分享一下go語(yǔ)言設(shè)置定時(shí)器的方法,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!
成都創(chuàng)新互聯(lián)公司專注于元江縣網(wǎng)站建設(shè)服務(wù)及定制,我們擁有豐富的企業(yè)做網(wǎng)站經(jīng)驗(yàn)。 熱誠(chéng)為您提供元江縣營(yíng)銷(xiāo)型網(wǎng)站建設(shè),元江縣網(wǎng)站制作、元江縣網(wǎng)頁(yè)設(shè)計(jì)、元江縣網(wǎng)站官網(wǎng)定制、重慶小程序開(kāi)發(fā)服務(wù),打造元江縣網(wǎng)絡(luò)公司原創(chuàng)品牌,更為您提供元江縣網(wǎng)站排名全網(wǎng)營(yíng)銷(xiāo)落地服務(wù)。
go語(yǔ)言設(shè)置定時(shí)器的方法:1、通過(guò)“time.NewTicker()”方法創(chuàng)建,其中ticker會(huì)按照設(shè)定的間隔時(shí)間觸發(fā);2、通過(guò)“time.NewTimer()”方法創(chuàng)建,其中timer只會(huì)執(zhí)行一詞;3、使用“After()”來(lái)創(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 }
通過(guò) time.NewTicker()創(chuàng)建,這種類(lèi)型,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 }
通過(guò) time.NewTimer()創(chuàng)建,這種類(lèi)型,timer只會(huì)執(zhí)行一次,當(dāng)然,可以在執(zhí)行完以后通過(guò)調(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ǔ)法糖。
下面通過(guò)代碼演示一下三種方式的使用:
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 // 通過(guò)通道阻塞,讓任務(wù)可以執(zhí)行完指定的次數(shù)。
該ticker每1秒觸發(fā)一次,即ticker.C中每一秒會(huì)有一個(gè)內(nèi)容加入,最后通過(guò)向ch中寫(xiě)入數(shù)字,讓程序解除阻塞,繼續(xù)執(zhí)行。
2.Timer
timer := time.NewTimer(time.Second * 1) // timer 只能按時(shí)觸發(fā)一次,可通過(guò)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 沒(méi)有終止,打印出 over 后會(huì)看見(jiàn)在繼續(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 沒(méi)有終止,打印出 over 后會(huì)看見(jiàn)在繼續(xù)執(zhí)行...") tt.Stop() <-time.After(time.Second * 2) fmt.Println("tt.Stop()后, tt 仍繼續(xù)執(zhí)行,只是關(guān)閉了 tt.C 通道。") }
部分執(zhí)行結(jié)果截圖:
最后補(bǔ)充一下,通過(guò)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 沒(méi)有終止,打印出 over 后會(huì)看見(jiàn)在繼續(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 沒(méi)干活了...")
在GO語(yǔ)言編寫(xiě)中,要熟練使用 channel。
以上是“go語(yǔ)言設(shè)置定時(shí)器的方法”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!