下載cron包: go get github.com/robfig/cron 開啟一個定時: 根據cron表達式進行時間調度,cron可以精確到秒,大部分表達式格式也是從秒開始。 c := cron.New()預設從分開始,所以加上cron.WithSeconds(),保證定時按照表達式字面意思執行 ...
下載cron包:
go get github.com/robfig/cron
開啟一個定時:
根據cron表達式進行時間調度,cron可以精確到秒,大部分表達式格式也是從秒開始。
c := cron.New()預設從分開始,所以加上cron.WithSeconds(),保證定時按照表達式字面意思執行。
func main() {
c := cron.New(cron.WithSeconds()) //精確到秒
//定時任務
spec := "*/1 * * * * ?" //cron表達式,每秒一次
c.AddFunc(spec, func() {
fmt.Println("11111")
})
c.Start()
select {} //阻塞主線程停止
}
停止定時:
由於goroutine沒有線程id,所以無法從外部停止指定的定時任務。cron自帶Stop()方法,支持在方法體里使用,來停止當前定時。
何時調用Stop()方法,需要根據自身業務觸發,例如運行完成100次後停止,資料庫當前狀態為註銷時停止,等等。
func main() {
c := cron.New(cron.WithSeconds()) //精確到秒
//定時任務
spec := "*/1 * * * * ?" //cron表達式,每秒一次
c.AddFunc(spec, func() {
status := getStatus() //獲取定時任務的狀態
if status == true {
fmt.Println("11111")
} else {
c.Stop() //當前定時任務狀態已註銷
}
})
c.Start()
select {} //阻塞主線程停止
}
開啟多個定時:
一個c對象可以載入多個定時任務,此時在其中一個方法里調用Stop()方法,所有定時任務都會停止。
func main() {
c := cron.New(cron.WithSeconds()) //精確到秒
//定時任務
spec := "*/1 * * * * ?" //cron表達式,每秒一次
c.AddFunc(spec, func() {
fmt.Println("11111")
})
spec1 := "*/5 * * * * ?" //cron表達式,每5秒一次
c.AddFunc(spec1, func() {
fmt.Println("22222")
})
c.Start()
select {} //阻塞主線程停止
}
常見cron表達式:
表達式如果算上年份,共7位:
秒 分 時 日 月 周 年
實際應用中很少用到年份,所以一般表達式都是6位:
秒 分 時 日 月 周
*/1 * * * * ? 每秒
00 * * * * ? 每分
00 30 22 * * ? 每天晚上22:30
00 30 22 * * 2 每周二晚上22:30
00 30 22 * * 1,3 每周一和周三晚上22:30
*/5 35 10 * * 1-3 每周一到周三上午10點35分00秒開始第一次,然後每5秒一次
00 10,40 14 ? 3 4 每年三月的星期四的下午14:10和14:40
需要更複雜更細緻的表達式寫法,可自行上網查找。
註意:
網上有很多不同的cron包,同一個包版本也有多個,整體用法雖相似,但對cron表達式的處理會有一定差別,例如c := cron.New()有直接從秒開始的,不用加cron.WithSeconds(),也有用5位長度來指定表達式的。
所以,具體使用哪個包,最好下載更新最新版本,表達式的語法也要通過實際測試進行驗證,保證任務按照我們指定的時間執行。
公眾號:李田路口