我实现的是将两个cron事件放入调度协程中,并判断是否过期,过期便执行
1、我们创建事件的结构体
2、将结构体放入map
3、起协程,并判断是否过期,检测判断过程应该减少cpu消耗
期间主协程应该睡眠,以防止中断
主要用到了github.com/gorhill/cronexpr包
package main
import (
"github.com/gorhill/cronexpr"
"time"
"fmt"
)
type CronJob struct {
expr *cronexpr.Expression
nextTime time.Time
}
func main() {
var (
expr *cronexpr.Expression
now time.Time
cronjob *CronJob
schedulTable map[string]*CronJob
)
schedulTable = make(map[string]*CronJob)
expr = cronexpr.MustParse("*/5 * * * * * *")
cronjob = &CronJob{
expr:expr,
nextTime:expr.Next(now),
}
schedulTable["Job_1"] = cronjob
expr = cronexpr.MustParse("*/4 * * * * * *")
cronjob = &CronJob{
expr:expr,
nextTime:expr.Next(now),
}
schedulTable["Job_2"] = cronjob
go func() {
var (
jobName string
cronjob *CronJob
)
for {
for jobName,cronjob = range schedulTable{
if cronjob.nextTime.Before(time.Now()) || cronjob.nextTime.Equal(time.Now()){
go func() {
fmt.Println("执行:", jobName)
}()
cronjob.nextTime = cronjob.expr.Next(time.Now())
fmt.Println(jobName,"下次执行时间:",cronjob.nextTime)
}
}
select {
case <- time.NewTimer(100*time.Millisecond).C:
}
}
}()
time.Sleep(30*time.Second)
}