第三方库
代码演示
package main
import (
"fmt"
"github.com/gorhill/cronexpr"
"time"
)
/**
* @author micro.cloud.fly
* @date 2021/10/15 5:57 下午
* @desc 演示调度协程
*/
type Job struct {
conExpre *cronexpr.Expression
nextTime time.Time
}
func main() {
//定义两个Job
con1 := cronexpr.MustParse("*/3 * * * * * *")
now := time.Now()
job1 := Job{
conExpre: con1,
nextTime: con1.Next(now),
}
con2 := cronexpr.MustParse("*/5 * * * * * *")
job2 := Job{
conExpre: con2,
nextTime: con1.Next(now),
}
//定义一个map,用来存储这两个job
m := make(map[string]*Job)
m["job1"] = &job1
m["job2"] = &job2
//拉起一个协程,监控这两个任务
go func() {
for {
curr := time.Now()
for jobName, job := range m {
if job.nextTime.Before(curr) || job.nextTime.Equal(curr) {
//注意这里需要将变量复制过去,传到这个方法中
go func(jobname string) {
fmt.Println(curr, " 执行任务:", jobname)
}(jobName)
//重置下次执行时间
job.nextTime = job.conExpre.Next(curr)
fmt.Println(jobName, "下次执行时间为:", job.nextTime)
}
}
time.Sleep(100 * time.Millisecond)
}
}()
time.Sleep(20 * time.Second)
}
执行输出
job1 下次执行时间为: 2021-10-15 18:07:51 +0800 CST
job2 下次执行时间为: 2021-10-15 18:07:50 +0800 CST
2021-10-15 18:07:48.015409 +0800 CST m=+1.232900015 执行任务: job1
2021-10-15 18:07:48.015409 +0800 CST m=+1.232900015 执行任务: job2
job2 下次执行时间为: 2021-10-15 18:07:55 +0800 CST
2021-10-15 18:07:50.061674 +0800 CST m=+3.279103272 执行任务: job2
job1 下次执行时间为: 2021-10-15 18:07:54 +0800 CST
2021-10-15 18:07:51.09857 +0800 CST m=+4.315968560 执行任务: job1
job1 下次执行时间为: 2021-10-15 18:07:57 +0800 CST
2021-10-15 18:07:54.08335 +0800 CST m=+7.300659041 执行任务: job1
job2 下次执行时间为: 2021-10-15 18:08:00 +0800 CST
2021-10-15 18:07:55.009302 +0800 CST m=+8.226583525 执行任务: job2
job1 下次执行时间为: 2021-10-15 18:08:00 +0800 CST
2021-10-15 18:07:57.049528 +0800 CST m=+10.266748115 执行任务: job1
job1 下次执行时间为: 2021-10-15 18:08:03 +0800 CST
job2 下次执行时间为: 2021-10-15 18:08:05 +0800 CST
2021-10-15 18:08:00.01745 +0800 CST m=+13.234580215 执行任务: job1
2021-10-15 18:08:00.01745 +0800 CST m=+13.234580215 执行任务: job2
job1 下次执行时间为: 2021-10-15 18:08:06 +0800 CST
2021-10-15 18:08:03.075889 +0800 CST m=+16.292927628 执行任务: job1
job2 下次执行时间为: 2021-10-15 18:08:10 +0800 CST
2021-10-15 18:08:05.017993 +0800 CST m=+18.234974031 执行任务: job2
job1 下次执行时间为: 2021-10-15 18:08:09 +0800 CST
2021-10-15 18:08:06.038355 +0800 CST m=+19.255304875 执行任务: job1