網(wǎng)站首頁(yè) 編程語(yǔ)言 正文
Go編寫定時(shí)器與定時(shí)任務(wù)詳解(附第三方庫(kù)gocron用法)_Golang
作者:太陽(yáng)上的雨天 ? 更新時(shí)間: 2022-09-07 編程語(yǔ)言Go 編寫定時(shí)器和定時(shí)任務(wù)
在 項(xiàng)目開(kāi)發(fā)當(dāng)中,可能會(huì)遇到這樣的場(chǎng)景:
1 A任務(wù)需要在多久之后執(zhí)行一次(定時(shí)器)
2.B任務(wù)需要每隔多長(zhǎng)時(shí)間執(zhí)行一次 (定時(shí)任務(wù))
談到定時(shí)任務(wù),離不開(kāi)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的用法
Timer
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í)器
? 通過(guò)向通道發(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í)器開(kāi)始") 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í)器開(kāi)始
?1 s 時(shí)間到 ?1648268475
Ticker
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 ...
gocron
一個(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()
Demo
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
總結(jié)
原文鏈接:https://blog.csdn.net/weixin_43713498/article/details/123750660
相關(guān)推薦
- 2022-06-29 docker容器狀態(tài)轉(zhuǎn)換管理命令實(shí)例詳解_docker
- 2022-10-16 Python?numpy生成矩陣基礎(chǔ)用法實(shí)例代碼_python
- 2021-12-28 Go語(yǔ)言做爬蟲(chóng)狀態(tài)碼返回418的問(wèn)題解決_Golang
- 2022-07-09 如何給 SAP Commerce Cloud Site 設(shè)置默認(rèn)語(yǔ)言
- 2022-09-26 css外邊距問(wèn)題和顯示模式
- 2022-12-10 C語(yǔ)言中使用qsort函數(shù)對(duì)自定義結(jié)構(gòu)體數(shù)組進(jìn)行排序_C 語(yǔ)言
- 2021-12-12 Docker?Consul概述以及集群環(huán)境搭建步驟(圖文詳解)_docker
- 2022-09-03 Python實(shí)現(xiàn)計(jì)算AUC的三種方式總結(jié)_python
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過(guò)濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡(jiǎn)單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對(duì)象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支