线上服务一些不是很敏感的资源我们希望通过开启定时任务进行回收,Linux 下有 crontab 命令用于设置周期性被执行的指令,setitimer 也是 Linux 的 API,可以用于定时执行某个任务。下面介绍一个 Golang 实现的定时任务方法。

Cron 的定时任务表达式

字段名 是否必须 允许的值 允许的特定字符
秒(Seconds) 0-59 * / , –
分(Minutes) 0-59 * / , –
时(Hours) 0-23 * / , –
日(Day of month) 1-31 * / , – ?
月(Month) 1-12 or JAN-DEC * / , –
星期(Day of week) 0-6 or SUM-SAT * / , – ?
**
/
,
-
?*

时间表达式例子

每隔 5 秒执行一次:*/5 * * * * ?

每隔 1 分钟执行一次:0 */1 * * * ?

每天 23 点执行一次:0 0 23 * * ?

每天凌晨 1 点执行一次:0 0 1 * * ?

每月 1 号凌晨 1 点执行一次:0 0 1 1 * ?

在 26 分、29 分、33 分执行一次:0 26,29,33 * * * ?

每天的 0 点、13 点、18 点、21 点都执行一次:0 0 0,13,18,21 * * ?

主要接口

  • Cron:包含一系列要执行的实体
  • Entry:调度实体
  • Job:每个实体包含一个需要运行的任务
    希望定期运行的任务,就需要实现 job 接口
  • Schedule:每个实体包含一个调度器,调度 job 的执行
    1
    2
    3
    4
    5
    6
    7
    type Schedule interface {
      // Return the next activation time, later than the given time.
      // Next is invoked initially, and then each time the job is run.
      // 返回同一 Entity 中的 Job 下一次执行的时间
      Next(time.Time) time.Time
    }
     

使用方法

  • 实例化 Cron
  • 实例化时间表达式
    每天凌晨三点执行
  • func (c *Cron) AddFunc(spec string, cmd func()) error
    配置定时任务的钩子函数

Dmeo