package main import ( "github.com/gorhill/cronexpr" "fmt" "time" ) func main(){ var( expr *cronexpr.Expression err error now time.Time nextTime time.Time ) //if expr,err = cronexpr.Parse("* * * * *");err != nil{ // fmt.Println(err) // return //} //expr = expr if expr,err = cronexpr.Parse("* * * * *");err !=nil{ fmt.Println(err) return } expr = expr now = time.Now() nextTime = expr.Next(now) fmt.Println(now,nextTime) time.AfterFunc(nextTime.Sub(now), func() { fmt.Println("被调度了:",nextTime) }) time.Sleep(50*time.Second) }
2019-08-01 23:00:25.7892266 +0800 CST m=+0.017000401 2019-08-01 23:01:00 +0800 CST 被调度了: 2019-08-01 23:01:00 +0800 CST Process finished with exit code 0
调度多个cron任务
package main import ( "github.com/gorhill/cronexpr" "fmt" "time" ) //代表一个任务 type CronJob struct { expr *cronexpr.Expression nextTime time.Time//expr.Next(Now) } func main(){ //需要有一个调度协程 它定时检查所有的cron任务 谁过期就执行谁 var( expr *cronexpr.Expression now time.Time cronJob *CronJob scheduleTable map[string]*CronJob //key:任务名字 ) scheduleTable = make(map[string]*CronJob) now = time.Now() //1定义两个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("下次执行时间:",cronJob.nextTime) } } //睡眠100毫秒 select { case <-time.NewTimer(100*time.Millisecond).C://1将在100毫秒可读 返回 } } }() time.Sleep(time.Second*100) }
下次执行时间: 2019-08-03 14:44:15 +0800 CST 下次执行时间: 2019-08-03 14:44:15 +0800 CST 执行: job2 执行: job1 下次执行时间: 2019-08-03 14:44:20 +0800 CST 下次执行时间: 2019-08-03 14:44:20 +0800 CST 执行: job2 执行: job1 下次执行时间: 2019-08-03 14:44:25 +0800 CST 下次执行时间: 2019-08-03 14:44:25 +0800 CST 执行: job1 执行: job2 下次执行时间: 2019-08-03 14:44:30 +0800 CST 执行: job1 执行: job2 下次执行时间: 2019-08-03 14:44:30 +0800 CST 下次执行时间: 2019-08-03 14:44:35 +0800 CST 下次执行时间: 2019-08-03 14:44:35 +0800 CST 执行: job1 执行: job2 下次执行时间: 2019-08-03 14:44:40 +0800 CST 执行: job2 下次执行时间: 2019-08-03 14:44:40 +0800 CST 执行: job1