Golang定時任務簡單實現


Golang定時任務簡單實現


下載cron包:

<code>go get github.com/robfig/cron/<code>

開啟一個定時:

根據cron表達式進行時間調度,cron可以精確到秒,大部分表達式格式也是從秒開始。

c := cron.New()默認從分開始,所以加上cron.WithSeconds(),保證定時按照表達式字面意思執行。

<code>func main() {
c := cron.New(cron.WithSeconds()) //精確到秒

//定時任務
spec := "*/1 * * * * ?" //cron表達式,每秒一次
c.AddFunc(spec, func() {
fmt.Println("11111")
})

c.Start()
select {} //阻塞主線程停止
}/<code>

停止定時:

由於goroutine沒有線程id,所以無法從外部停止指定的定時任務。cron自帶Stop()方法,支持在方法體裡使用,來停止當前定時。

何時調用Stop()方法,需要根據自身業務觸發,例如運行完成100次後停止,數據庫當前狀態為註銷時停止,等等。

<code>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 {} //阻塞主線程停止
}/<code>

開啟多個定時:

一個c對象可以加載多個定時任務,此時在其中一個方法裡調用Stop()方法,所有定時任務都會停止。

<code>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 {} //阻塞主線程停止
}/<code>

常見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位長度來指定表達式的。

所以,具體使用哪個包,最好下載更新最新版本,表達式的語法也要通過實際測試進行驗證,保證任務按照我們指定的時間執行。


分享到:


相關文章: