调度单个cron
- 这写代码的老师都喜欢用var 声明变量后使用
- 下次调度时间: nextTime = expr.Next(now)
- 超时时间计算:nextTime.Sub(now)
- 超时后执行回调函数:time.AfterFunc
package main
import (
"fmt"
"time"
"github.com/gorhill/cronexpr"
)
func main() {
var (
err error
expr *cronexpr.Expression
now time.Time
nextTime time.Time
)
if expr, err = cronexpr.Parse("*/5 * * * * * *"); err != nil {
fmt.Println(err)
return
}
now = time.Now()
nextTime = expr.Next(now)
time.AfterFunc(nextTime.Sub(now), func() {
fmt.Println("被调度了", nextTime)
})
time.Sleep(6 * time.Second)
}
调度多个cron任务
package main
import (
"fmt"
"time"
"github.com/gorhill/cronexpr"
)
type CronJob struct {
expr *cronexpr.Expression
nextTime time.Time
}
var (
cronJob *CronJob
expr *cronexpr.Expression
now time.Time
scheduleTable map[string]*CronJob
)
func main() {
now = time.Now()
scheduleTable = make(map[string]*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)
}
}
select {
case <-time.NewTimer(100 * time.Millisecond).C:
}
}
}()
time.Sleep(100 * time.Second)
}
job1 下次执行时间是: 2022-03-15 00:54:45 +0800 CST
执行: job1
job2 下次执行时间是: 2022-03-15 00:54:45 +0800 CST
执行: job2
执行: job1
job1 下次执行时间是: 2022-03-15 00:54:50 +0800 CST
job2 下次执行时间是: 2022-03-15 00:54:50 +0800 CST
执行: job2
job1 下次执行时间是: 2022-03-15 00:54:55 +0800 CST
job2 下次执行时间是: 2022-03-15 00:54:55 +0800 CST
执行: job1
执行: job2
执行: job1
job1 下次执行时间是: 2022-03-15 00:55:00 +0800 CST
执行: job2
job2 下次执行时间是: 2022-03-15 00:55:00 +0800 CST
执行: job1
job1 下次执行时间是: 2022-03-15 00:55:05 +0800 CST
job2 下次执行时间是: 2022-03-15 00:55:05 +0800 CST
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律