您好,登錄后才能下訂單哦!
這篇文章主要介紹“Go怎么編寫定時(shí)器與定時(shí)任務(wù)”,在日常操作中,相信很多人在Go怎么編寫定時(shí)器與定時(shí)任務(wù)問題上存在疑惑,小編查閱了各式資料,整理出簡(jiǎn)單好用的操作方法,希望對(duì)大家解答”Go怎么編寫定時(shí)器與定時(shí)任務(wù)”的疑惑有所幫助!接下來,請(qǐng)跟著小編一起來學(xué)習(xí)吧!
在 項(xiàng)目開發(fā)當(dāng)中,可能會(huì)遇到這樣的場(chǎng)景:
1 A任務(wù)需要在多久之后執(zhí)行一次(定時(shí)器)
2.B任務(wù)需要每隔多長(zhǎng)時(shí)間執(zhí)行一次 (定時(shí)任務(wù))
談到定時(shí)任務(wù),離不開linux的crontab. 先簡(jiǎn)單了解下crontab
// 每隔1秒執(zhí)行一次 */1 * * * * ? // 每隔1分鐘執(zhí)行一次 0 */1 * * * ? // 每天0點(diǎn)執(zhí)行一次 0 0 0 * * ? // 每月1號(hào)凌晨1點(diǎn)執(zhí)行一次 0 0 1 1 * ? // 在1分、2分、3分執(zhí)行一次 0 1,2,3 * * * ? // 每天的0點(diǎn)、1點(diǎn)、2點(diǎn)執(zhí)行一次 0 0 0,1,2 * * ?
使用crontab實(shí)現(xiàn)定時(shí)器和定時(shí)任務(wù)也可以,但是crontab默認(rèn)只能精確到分鐘, 如果想要精確到秒可以使用for循環(huán)處理秒級(jí)人物
* * * * * for i in $(seq 1 11); do echo test >> /etc/demo/demo.txt; sleep 1; done
本文簡(jiǎn)單介紹下go 實(shí)現(xiàn)定時(shí)器和定時(shí)任務(wù)的用法以及簡(jiǎn)單介紹一個(gè)第三方庫(kù)gocron的用法
1 timer實(shí)現(xiàn)定時(shí)器 (延遲執(zhí)行), 這個(gè)定時(shí)器只會(huì)觸發(fā)一次.
使用于場(chǎng)景1(當(dāng)然如果把下面的代碼寫在一個(gè)for循環(huán)中也可以實(shí)現(xiàn)定時(shí)任務(wù))
Demo:
package main import ( "fmt" "time" ) func main() { t := time.NewTimer(1 * time.Second) <-t.C fmt.Println("1 s 時(shí)間到") }
結(jié)果:
1 s 時(shí)間到
2 停止定時(shí)器
使用time.Stop() 停止定時(shí)器
通過向通道發(fā)送一個(gè)信號(hào),通知定時(shí)器是否關(guān)閉
Demo:
package main import ( "fmt" "time" ) func test12(ch chan int) bool { timer := time.NewTimer(1 * time.Second) select { case <-ch: if timer.Stop() { fmt.Println("關(guān)閉定時(shí)器") } return true default: fmt.Println("繼續(xù)執(zhí)行定時(shí)器") return true } } func main() { ch := make(chan int, 1) // ch <- 1 go test12(ch) for { } }
結(jié)果:
繼續(xù)執(zhí)行定時(shí)器
重置定時(shí)器
Demo:
func main() { // 創(chuàng)建一個(gè)一個(gè)定時(shí)器 fmt.Println("定時(shí)器開始") myT := time.NewTimer(7 * time.Second) // 設(shè)置7秒后執(zhí)行一次 // 重置定時(shí)器為 1s后執(zhí)行 myT.Reset(1 * time.Second) <-myT.C fmt.Println(" 1 s 時(shí)間到 ", time.Now().Unix()) for { } }
結(jié)果:
定時(shí)器開始
1 s 時(shí)間到 1648268475
Ticker也是定時(shí)器,它是一個(gè)周期性的定時(shí)器 使用場(chǎng)景2
設(shè)置3秒執(zhí)行一次Demo
package main import ( "fmt" "time" ) func main() { ticker := time.NewTicker(3 * time.Second) defer ticker.Stop() for range ticker.C { fmt.Println("執(zhí)行的業(yè)務(wù)邏輯") } }
結(jié)果:
ticker ticker ticker ...
ticker ticker ticker ...
ticker ticker ticker ...
一個(gè)第三方庫(kù)實(shí)現(xiàn)定時(shí)任務(wù) 場(chǎng)景2
go get -u github.com/go-co-op/gocron
s := gocron.NewScheduler(time.UTC) s.Every(5).Seconds().Do(func(){ ... }) s.Every("5m").Do(func(){ ... }) s.Every(5).Days().Do(fu s.Every(1).Month(1, 2, 3).Do(func(){ ... }) s.Every(1).Day().At("10:30").Do(func(){ ... }) s.Every(1).Day().At("10:30;08:00").Do(func(){ ... }) s.Every(1).Day().At("10:30").At("08:00").Do(func(){ ... }) s.Every(1).MonthLastDay().Do(func(){ ... }) s.Every(2).MonthLastDay().Do(func(){ ... }) s.Cron("*/1 * * * *").Do(task) s.StartAsync() s.StartBlocking()
package main import ( "fmt" "time" "github.com/go-co-op/gocron" ) func cron1() { fmt.Println("cron1") } func cron2() { fmt.Println("cron2") } func main() { timezone, _ := time.LoadLocation("Asia/Shanghai") s := gocron.NewScheduler(timezone) // 每秒執(zhí)行一次 s.Every(1).Seconds().Do(func() { go cron1() }) // 每秒執(zhí)行一次 s.Every(1).Second().Do(func() { go cron2() }) s.StartBlocking() }
結(jié)果:
cron2
cron1
cron1
cron2
cron1
cron2
cron1
cron2
到此,關(guān)于“Go怎么編寫定時(shí)器與定時(shí)任務(wù)”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請(qǐng)繼續(xù)關(guān)注億速云網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)砀鄬?shí)用的文章!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。