go任務調度2(linux的cron調用)
阿新 • • 發佈:2019-04-19
cst ble ise sch 支持 ech 定義 根據 erro
cron格式:
分 時 日 月 周
每隔5分鐘執行1次: /5 * echo hello > /tmp/x.log
每隔1-5分鐘執行1次: 1-5 echo hello > /tmp/x.log
每天10點整、22點整執行1次: 0 10,22 * echo hello > /tmp/x.log
每隔1-5分鐘執行1次: 1-5 echo hello > /tmp/x.log
Parse():解析與校驗Cron表達式
Next():根據當前時間,計算下次調度時間
package main import ( "fmt" "github.com/gorhill/cronexpr" "time" ) func main() { var ( expr *cronexpr.Expression err error now time.Time nextTime time.Time ) //每隔5分鐘執行一次(這個庫支持7位,精確到秒、年) if expr, err = cronexpr.Parse("*/5 * * * * * *"); err != nil { fmt.Println(err) return } //當前時間 now = time.Now() //下次調度時間 nextTime = expr.Next(now) //等待這個定時器超時 time.AfterFunc(nextTime.Sub(now), func() { fmt.Println("被調度了:", nextTime) }) //下次時間減去當前時間 time.Sleep(10 * time.Second) }
調用一個cron
輸出:被調度了: 2019-04-19 17:00:30 +0800 CST
package main import ( "fmt" "github.com/gorhill/cronexpr" "time" ) //代表一個任務 type CronJob struct { expr *cronexpr.Expression nextTime time.Time //expr.Next(time.Now())就可以得到下一次調度時間 } func main() { //需要有1個調度協程,它定時檢查所有Cron任務,誰過期了就執行誰 var ( cronJob *CronJob expr *cronexpr.Expression now time.Time scheduleTable map[string] *CronJob //key:任務名字, ) scheduleTable = make(map[string]*CronJob) //當前時間 now = time.Now() //定義第一個cronjob expr = cronexpr.MustParse("*/5 * * * * * *") cronJob = &CronJob{ expr: expr, nextTime: expr.Next(now), } //任務註冊到了調度表 scheduleTable["job1"] = cronJob //定義第二個cronjob expr = cronexpr.MustParse("*/5 * * * * * *") cronJob = &CronJob{ expr: expr, nextTime: expr.Next(now), } //任務註冊到了調度表 scheduleTable["job2"] = cronJob //啟動調度協程 go func() { var ( jobName string cronJob *CronJob now time.Time ) //定時檢查任務調度表是否有到期的 for { now = time.Now() for jobName, cronJob = range scheduleTable { //判斷是否過期(如果下次調度時間早於等於當前時間,說明已經過期了) if cronJob.nextTime.Before(now) || cronJob.nextTime.Equal(now) { //啟動一個協程,執行這個任務 go func(jobName string) { fmt.Println("執行:", jobName) }(jobName) //計算下一次調度時間 cronJob.nextTime = cronJob.expr.Next(now) fmt.Println(jobName, "下次執行時間:", cronJob.nextTime) } } select { //睡眠100毫秒(不讓它占用過多cpu) case <- time.NewTimer(100 * time.Millisecond).C: //將在100毫秒可讀,返回 } } }() time.Sleep(100 * time.Second) }
調用多個cron,按時間間隔輸出:
執行: job1
job1 下次執行時間: 2019-04-19 17:31:20 +0800 CST
job2 下次執行時間: 2019-04-19 17:31:20 +0800 CST
執行: job2
執行: job1
job1 下次執行時間: 2019-04-19 17:31:25 +0800 CST
執行: job2
job2 下次執行時間: 2019-04-19 17:31:25 +0800 CST
執行: job1
job1 下次執行時間: 2019-04-19 17:31:30 +0800 CST
job2 下次執行時間: 2019-04-19 17:31:30 +0800 CST
執行: job2
......
go任務調度2(linux的cron調用)