// crontab基础 // linux crontab // 秒粒度, 年配置(2018-2099) // 哪一分钟(0-59),哪小时(0-23),哪天(1-31),哪月(1-12),星期几(0-6)
// expr 和 nextTime import ( "github.com/gorhill/cronexpr" ) expr, err = cronexpr.Parse("*/1 * * * * * *") //每隔5min执行一次 now = time.Now() nextTime = expr.Next(now) // 下次调度时间 time.AfterFunc(nextTime.Sub(now), func() { fmt.Println("被调度了:", nextTime) })
expr = cronexpr.MustParse("*/5 * * * * * *") expr.Next(now) // time对象的方法 cronJob.nextTime.Before(now) || cronJob.nextTime.Equal(now)
// crontab调用模型 import ( "github.com/gorhill/cronexpr" "time" "fmt" ) // 代表一个任务 type CronJob struct { expr *cronexpr.Expression nextTime time.Time // expr.Next(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() // 1, 我们定义2个cronjob expr = cronexpr.MustParse("*/5 * * * * * *") cronJob = &CronJob{ expr: expr, nextTime: expr.Next(now), } // 任务注册到调度表 scheduleTable["job1"] = 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) } } // 睡眠100毫秒 select { case <- time.NewTimer(100 * time.Millisecond).C: // 将在100毫秒可读,返回 } } }() time.Sleep(100 * time.Second) }