1. // crontab基础
  2. // linux crontab
  3. // 秒粒度, 年配置(2018-2099)
  4. // 哪一分钟(0-59),哪小时(0-23),哪天(1-31),哪月(1-12),星期几(0-6)
  1. // expr 和 nextTime
  2. import (
  3. "github.com/gorhill/cronexpr"
  4. )
  5. expr, err = cronexpr.Parse("*/1 * * * * * *") //每隔5min执行一次
  6. now = time.Now()
  7. nextTime = expr.Next(now) // 下次调度时间
  8. time.AfterFunc(nextTime.Sub(now), func() {
  9. fmt.Println("被调度了:", nextTime)
  10. })
  1. expr = cronexpr.MustParse("*/5 * * * * * *")
  2. expr.Next(now)
  3. // time对象的方法
  4. cronJob.nextTime.Before(now) || cronJob.nextTime.Equal(now)
  1. // crontab调用模型
  2. import (
  3. "github.com/gorhill/cronexpr"
  4. "time"
  5. "fmt"
  6. )
  7. // 代表一个任务
  8. type CronJob struct {
  9. expr *cronexpr.Expression
  10. nextTime time.Time // expr.Next(now)
  11. }
  12. func main() {
  13. // 需要有1个调度协程, 它定时检查所有的Cron任务, 谁过期了就执行谁
  14. var (
  15. cronJob *CronJob
  16. expr *cronexpr.Expression
  17. now time.Time
  18. scheduleTable map[string]*CronJob // key: 任务的名字,
  19. )
  20. scheduleTable = make(map[string]*CronJob)
  21. // 当前时间
  22. now = time.Now()
  23. // 1, 我们定义2个cronjob
  24. expr = cronexpr.MustParse("*/5 * * * * * *")
  25. cronJob = &CronJob{
  26. expr: expr,
  27. nextTime: expr.Next(now),
  28. }
  29. // 任务注册到调度表
  30. scheduleTable["job1"] = cronJob
  31. expr = cronexpr.MustParse("*/5 * * * * * *")
  32. cronJob = &CronJob{
  33. expr: expr,
  34. nextTime: expr.Next(now),
  35. }
  36. // 任务注册到调度表
  37. scheduleTable["job2"] = cronJob
  38. // 启动一个调度协程
  39. go func() {
  40. var (
  41. jobName string
  42. cronJob *CronJob
  43. now time.Time
  44. )
  45. // 定时检查一下任务调度表
  46. for {
  47. now = time.Now()
  48. for jobName, cronJob = range scheduleTable {
  49. // 判断是否过期
  50. if cronJob.nextTime.Before(now) || cronJob.nextTime.Equal(now) {
  51. // 启动一个协程, 执行这个任务
  52. go func(jobName string) {
  53. fmt.Println("执行:", jobName)
  54. }(jobName)
  55. // 计算下一次调度时间
  56. cronJob.nextTime = cronJob.expr.Next(now)
  57. fmt.Println(jobName, "下次执行时间:", cronJob.nextTime)
  58. }
  59. }
  60. // 睡眠100毫秒
  61. select {
  62. case <- time.NewTimer(100 * time.Millisecond).C: // 将在100毫秒可读,返回
  63. }
  64. }
  65. }()
  66. time.Sleep(100 * time.Second)
  67. }

[go]gorhill/cronexpr用go实现crontab的更多相关文章

  1. golang cronexpr定时任务包使用

    包获取 go get -u github.com/gorhill/cronexpr 创建一个定时任务 expr, err = cron.Parse("* * * * *"); 获得 ...

  2. cronexpr任务调度

    package main import ( "github.com/gorhill/cronexpr" "fmt" "time" ) fun ...

  3. Go语言web开发---Cronexpr 包实现并发定时任务

    安装Cronexpr包: go get -u github.com/gorhill/cronexpr 这个包支持七位时间控制 *(秒) *(分) *(时) *(日) *(月) *(周) *(年) 栗子 ...

  4. GO实现Cron解析和定时任务

    Go的Cron表达式解析库:github.com/gorhill/cronexpr 核心类型和方法 // 表达式对象 expr *cronexpr.Expression // 解析cron表达式 ex ...

  5. 02 . Go开发一个日志收集平台之Context及etcd简单使用

    Context简单使用 context设置,获取value值 应用于全局通用参数传递 package main import ( "context" "fmt" ...

  6. crontab介绍

    1.Cron的启动与关闭 由于Cron是Linux的内置服务,可以用以下的方法启动.关闭这个服务: /sbin/service crond start           //启动服务/sbin/se ...

  7. 使用python crontab设置linux定时任务

    熟悉linux的朋友应该知道在linux中可以使用crontab设置定时任务.可以通过命令crontab -e编写任务.当然也可以直接写配置文件设置任务. 但是有时候希望通过脚本自动设置,比如我们应用 ...

  8. 浅谈 linux 例行性工作 crontab (linux定时任务)

    定时任务大家都挺说过,就好比你手机上的闹钟,到了指定的时候就会响起. 今天在对redis缓存进行定时储存时又操作了一把,发现一些细节,写的不好.大家就将就看吧, 首先 简单介绍一下linux 例行性工 ...

  9. 用Crontab打造简易工作流引擎

    1. 引言 众所周知,Oozie(1, 2)是基于时间条件与数据生成来做工作流调度的,但是Oozie的数据触发条件只支持HDFS路径,故而面临着这样的问题: 无法判断Hive partition是否已 ...

随机推荐

  1. Spring web.xml详解

    web.xml文件是Java Web项目中的一个配置文件,主要用于配置欢迎页.Filter.Listener.Servlet等,但并不是必须的,一个Java Web项目没有web.xml文件也是照样能 ...

  2. elasticsearch 配置外网访问

    进入  config/ elasticsearch.ym 修改:network.host: 127.0.0.1 或者内网Ip 添加:http.host: 0.0.0.0

  3. 【坑】new一个对象时,tostring报空指针异常

    错误环境 java1.8.0_111 错误描述 对某vo进行了修改,属性类型由long修改为了Long,getter.setter没有修改类型 调用该对象的new方法时抛出npe 错误原因 没深究.. ...

  4. 【异常】warning: refname 'feature1.3.0' is ambiguous.导致git merge失败

    1 现象 自己git merge --no-ff feature1.3.0 无法合并代码到develop,代码还是停留在feature1.3.0的分支 并提示一下错误 warning: refname ...

  5. Java通过JDBC连接SQL Server2017数据库

    一.需要明白的基础知识 数据库名 驱动jar(x表示版本号) 具体驱动类 连接字符串(ip地址,端口号,名字) Oracle ojdbc-x.jar oracle.jdbc.oracleDriver ...

  6. Django:中间件与csrf

    一.中间件 什么是中间件 中间件有什么用 自定义中间件 中间件应用场景 二.csrf csrf token跨站请求伪造 一.中间件 什么是中间件 中间件顾名思义,是介于request与response ...

  7. 如何正确清理C盘?

    Windows电脑操作系统一般是安装在磁盘驱动器的C盘中,一旦运行,便会产生许多垃圾文件,C盘空间在一定程度上都会越来越小.伴随着电脑工作的时间越久,C盘常常会提示显示其内存已不足.那么C盘容量不足对 ...

  8. Centos使用光盘yum源

    yum查看所有源 yum repolist all 方法一:本机使用光盘源安装软件的设置 mkdir /media/cdrom mount /dev/cdrom  /media/cdrom vim / ...

  9. 一图一知-TS之symbol

  10. 学习elasticsearch(一)linux环境搭建(1)

    首先安装了Oracle Virtual Box 然后安装了最小版的CentOS.由于vbox自带的操作面板不太好用,于是用了xshell,XShell连接最小版的centOS时遇到的问题记录下. 1. ...