Go的Cron表达式解析库:github.com/gorhill/cronexpr

核心类型和方法

  1. // 表达式对象
  2. expr *cronexpr.Expression
  3. // 解析cron表达式
  4. expr = cronexpr.Parse()
  5. // 返回下次执行时间
  6. expr.Next()

解析Cron表达式

  1. func PrintCronNext() {
  2. var (
  3. cronLine string
  4. expr *cronexpr.Expression
  5. )
  6. // 定时参数的格式 秒 分 时 日 月 周 年
  7. cronLine = "*/5 * * * * * *"
  8. expr, _ = cronexpr.Parse(cronLine)
  9. // expr.Next基于某个时间给出下一次的执行时间
  10. fmt.Println(expr.Next(time.Now()))
  11. // expr.NextN返回多个Next时间
  12. fmt.Println(expr.NextN(time.Now(), 5))
  13. }

执行定时任务

  1. // 结合time.AfterFunc实现定时任务的执行
  2. func ExecWithCronNext() {
  3. var (
  4. cronLine string
  5. expr *cronexpr.Expression
  6. )
  7. cronLine = "*/5 * * * * * *"
  8. expr, _ = cronexpr.Parse(cronLine)
  9. // AfterFunc用于在指定的Duration后执行相应的函数
  10. // expr.Next() - time.Now() 得到相应的Duration
  11. time.AfterFunc(expr.Next(time.Now()).Sub(time.Now()), func() {
  12. fmt.Println("定时任务被执行了")
  13. })
  14. // 挂起主线程
  15. time.Sleep(10 * time.Second)
  16. }

实现定时任务循环调度

  1. // 封装一个任务
  2. type CronJob struct {
  3. expr *cronexpr.Expression
  4. nextTime time.Time
  5. job func() // 传递要执行的任务
  6. }
  7. // 构建调度器实现循环调度
  8. func ScheduleWithCron() {
  9. // 调度器的本质是要循环一个调度表实现调度
  10. var (
  11. cronLine string
  12. expr *cronexpr.Expression
  13. cronJob *CronJob
  14. scheduleTable map[string]*CronJob
  15. )
  16. cronLine = "*/5 * * * * * *"
  17. // MustParse在Parse基础上当有err出现时进行Panic
  18. expr = cronexpr.MustParse(cronLine)
  19. // 新建任务
  20. cronJob = &CronJob{
  21. expr: expr,
  22. nextTime: expr.Next(time.Now()),
  23. job: func() {
  24. fmt.Println("do cron job")
  25. },
  26. }
  27. // map类型需要make进行内存分配
  28. scheduleTable = make(map[string]*CronJob)
  29. // 将任务添加到调度表
  30. scheduleTable["job1"] = cronJob
  31. // 启动调度goroutine实现遍历调度表
  32. go func() {
  33. var (
  34. jobName string
  35. cronJob *CronJob
  36. now time.Time
  37. )
  38. for {
  39. now = time.Now()
  40. // range是go中的遍历语法
  41. for jobName, cronJob = range scheduleTable {
  42. // 比较每个CronJob中的NextTime是否已经过期
  43. if cronJob.nextTime.Before(now) || cronJob.nextTime.Equal(now) {
  44. // 如果已经过期或者刚好相等,则启动一个goroutine来执行任务
  45. go func() {
  46. fmt.Printf("开始执行任务: %s \n", jobName)
  47. cronJob.job()
  48. }()
  49. // 更新一下NextTime
  50. cronJob.nextTime = cronJob.expr.Next(now)
  51. }
  52. }
  53. // 控制一下遍历调度表的频率
  54. select {
  55. // 使用time.NewTimer创建定时器,NewTimer.C返回一个channel
  56. // 当时间到了一个channel中会被放入一个Time类型的值从而唤醒阻塞,继续for遍历
  57. case <- time.NewTimer(100 * time.Millisecond).C:
  58. }
  59. }
  60. }()
  61. time.Sleep(100 * time.Second)
  62. }

GO实现Cron解析和定时任务的更多相关文章

  1. 将定时任务cron 解析成中文

    在使用定时器 quartz 时,其中的cron 表达式,老板表示作为开发的你能看懂外,其他的非开发同事可能看不懂,要用一个他们能看懂的方式表达出来. 还好我们的项目要求的表达式不是特别的麻烦,所以就写 ...

  2. 最强cron解析器

    背景 大家有没有这么一种困境 我现在需要去配置一个定时任务:"每天早上九点执行任务" 若你有一个好的定时任务平台,相信很容易就能配置完成.那若是没有定时任务平台呢?是不是就要自己写 ...

  3. PHP结合Linux的cron命令实现定时任务

    PHP死循环 来处理定时任务的效率是很低的.(众多网友评价)大家都建议使用Linux内置的定时任务crontab命令来调用php脚本来实现. PHP定时任务的两种方法:1.web方式调用php网页,但 ...

  4. docker(ubuntu)中安装cron运行crontab定时任务

    1.安装cron apt-get install cron 设置crontab定时任务 crontab -e */ * * * * /usr/bin/python /python/asch-check ...

  5. TP5 用cron实现linux定时任务

    TP5 用cron实现linux定时任务 1) tp5的控制器内容: namespace app\test\controller; use think\Controller; use think\fa ...

  6. Cron和Spring定时任务

    1.Java Spring spring定时任务cronExpression的值(配置定时时间)格式说明: 一个cronExpression表达式有至少6个(也可能是7个)由空格分隔的时间元素.从左至 ...

  7. /etc/cron.d添加定时任务脚本后不生效

    原因:定时任务脚本中的命令中包含了环境变量,crontab不能读取到环境变量. vim /etc/cron.d/mymon #mymon内容如下: * * * * * root cd $GOPATH/ ...

  8. 使用cron命令配置定时任务(cron jobs)

    原文 http://www.cnblogs.com/end/archive/2012/02/21/2361741.html 开机就启动cron进程的设置命令:chkconfig --add crond ...

  9. 使用Cron表达式创建定时任务

    CronTriggerCronTrigger功能非常强大,是基于日历的作业调度,而SimpleTrigger是精准指定间隔,所以相比SimpleTrigger,CroTrigger更加常用.CroTr ...

随机推荐

  1. 【4opencv】为基于OpenCV的图像处理程序编写界面—关于QT\MFC\CSharp的选择以及GOCW的介绍

            基于OpenCV编写图像处理项目,除了算法以外,比较重要一个问题就是界面设计问题.对于c++语系的程序员来说,一般来说有QT/MFC两种考虑.QT的确功能强大,特别是QML编写andr ...

  2. Flutter的Padding、Raw、Column、Expanded组件的基本使用

    Padding组件: Padding组件的基本使用代码: import 'package:flutter/material.dart'; import 'package:flutter_testdem ...

  3. Centos7安装完成后设定基本的网络配置

    Centos7设定网络 新安装的centos7,网络默认是不启动的,需要人为的手工修改配置文件,在这里把这个过程简要的记录一下. 设定ip地址与mac地址自定义 [root@web ~]# cd /e ...

  4. [整理] linux ubuntu 服务器键盘设置错误 完美解决

    根据 原文来源:https://blog.csdn.net/mingjie1212/article/details/48525095 进行修改. 使用命令 dpkg-reconfigure keybo ...

  5. java CountDownLatch报错java.lang.IllegalMonitorStateException: null

    笔者使用websocket进行通信,服务器异步返回.websocket服务器又异步调用其他websocket,也是异步访问. 由于无法预测服务器调用第三方websocket什么时候调用结束,使用了Co ...

  6. c++生成数据程序模板

    in.cpp: #include<bits/stdc++.h> #define random(a,b) rand()%(b-a+1)+a using namespace std; cons ...

  7. Prometheus监控教程——从入门到放弃

    Prometheus的安装还是比较简单的 下载地址如下 https://prometheus.io/download/ 解压,修改配置,运行.默认监听9090端口 [root@localhost ~] ...

  8. java 方法传值浅拷贝验证

    source code import org.junit.Test; public class SigmoidTruncatedSuit { @Test public void main_test() ...

  9. 配置git diff和git merge使用的第三方工具

    一般在运行git merge branchName后,git 如果提示了merger冲突,然后运行git mergetool.Git提示冲突后,运行git mergetool  --tool-help ...

  10. SQL Server ---- 创建好的表修改不了字段

    注意这个  是  sqlserver  2008  R2 当修改字段后出现来这个错误 解决方法 1.点击工具   选择选项 2.选择 designers     把阻止更改点掉就行了 建议,改好之后最 ...