下載cron包:git
go get github.com/robfig/cron
開啓一個定時:
根據cron表達式進行時間調度,cron能夠精確到秒,大部分表達式格式也是從秒開始。
c := cron.New()默認從分開始,因此加上cron.WithSeconds(),保證定時按照表達式字面意思執行。github
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表達式:spa
表達式若是算上年份,共7位:線程
秒 分 時 日 月 周 年code
實際應用中不多用到年份,因此通常表達式都是6位:對象
秒 分 時 日 月 周token
*/1 * * * * ? 每秒get
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位長度來指定表達式的。
因此,具體使用哪一個包,最好下載更新最新版本,表達式的語法也要經過實際測試進行驗證,保證任務按照咱們指定的時間執行。
公衆號:李田路口