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
本文来自博客园,作者:孙龙-程序员,转载请注明原文链接:https://www.cnblogs.com/sunlong88/p/11285947.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· DeepSeek在M芯片Mac上本地化部署
· 葡萄城 AI 搜索升级:DeepSeek 加持,客户体验更智能