package main
import (
"fmt"
"github.com/gorhill/cronexpr"
"time"
)
//创建任务结构体
type CronJob struct {
Expression *cronexpr.Expression
NextTime time.Time
}
func main() {
var(
err error
expr, expression *cronexpr.Expression
now, nextTime time.Time
cronJob *CronJob
scheduleTable map[string]*CronJob
jobName string
)
//构造Expression
expression = cronexpr.MustParse("*/5 * * * * * *") //每5s执行1次
now = time.Now()
//获取下次任务执行的时间
nextTime = expression.Next(now)
fmt.Println(now, nextTime)
cronJob = &CronJob{Expression:expression, NextTime:nextTime}
//初始化map
scheduleTable = make(map[string]*CronJob)
//添加任务
scheduleTable["job1"] = cronJob
//解析Expression表达式
if expr, err = cronexpr.Parse("*/3 * * * * * *"); err != nil{
return
}
//添加任务
scheduleTable["job2"] = &CronJob{Expression:expr, NextTime:expr.Next(now)}
for{
now = time.Now()
for jobName, cronJob = range scheduleTable{
//判断任务是否超时或和当前时间相同
if cronJob.NextTime.Before(now) || cronJob.NextTime.Equal(now){
//调用协程去执行任务
go func(k string) {
fmt.Println("超时了,执行任务", k)
}(jobName)
}
//更新任务的下次执行时间
cronJob.NextTime = cronJob.Expression.Next(now)
}
}
}复制代码
转载于:https://juejin.im/post/5d020305e51d4556dc293619