English | 中文
一个用于 Go 语言的 cron 定时任务库。
go get github.com/gocronx-team/cron调用者可以注册函数在指定的时间计划上执行。Cron 会在独立的 goroutine 中运行这些函数。必须为每个任务提供一个名称。
c := cron.New()
c.AddFunc("0 5 * * * *", func() { fmt.Println("每5分钟执行一次") }, "频繁任务")
c.AddFunc("@hourly", func() { fmt.Println("每小时执行一次") }, "小时任务")
c.AddFunc("@every 1h30m", func() { fmt.Println("每1小时30分钟执行一次") }, "定期任务")
c.Start()
..
// 函数在独立的 goroutine 中异步执行
...
// 也可以向正在运行的 Cron 添加函数
c.AddFunc("@daily", func() { fmt.Println("每天执行一次") }, "我的任务")
..
// 检查 cron 任务条目的下次和上次运行时间
inspect(c.Entries())
..
// 通过名称从 cron 中移除条目
c.RemoveJob("我的任务")
..
c.Stop() // 停止调度器(不会停止已经在运行的任务)本节描述此 cron 库接受的特定格式。部分内容摘自 维基百科文章。
cron 表达式表示一组时间,使用 6 个空格分隔的字段。
| 字段名称 | 必需? | 允许的值 | 允许的特殊字符 |
|---|---|---|---|
| 秒 | 是 | 0-59 | * / , - |
| 分钟 | 是 | 0-59 | * / , - |
| 小时 | 是 | 0-23 | * / , - |
| 日期 | 是 | 1-31 | * / , - ? |
| 月份 | 是 | 1-12 或 JAN-DEC | * / , - |
| 星期 | 是 | 0-6 或 SUN-SAT | * / , - ? |
注意:月份和星期字段值不区分大小写。"SUN"、"Sun" 和 "sun" 都是可接受的。
星号表示 cron 表达式将匹配该字段的所有值;例如,在第5个字段(月份)中使用星号表示每个月。
斜杠用于描述范围的增量。例如,在第1个字段(分钟)中使用 3-59/15 表示该小时的第3分钟以及此后每15分钟。形式 "*/..." 等同于形式 "first-last/...",即在该字段的最大可能范围内的增量。形式 "N/..." 被接受为 "N-MAX/..." 的意思,即从 N 开始,使用增量直到该特定范围的结束。它不会循环。
逗号用于分隔列表项。例如,在第5个字段(星期)中使用 "MON,WED,FRI" 表示星期一、星期三和星期五。
连字符用于定义范围。例如,9-17 表示上午9点到下午5点之间的每个小时(包括边界)。
问号可以用来代替 '*',用于将日期或星期字段留空。
您可以使用几个预定义的计划来代替 cron 表达式。
| 条目 | 描述 | 等同于 |
|---|---|---|
| @yearly (或 @annually) | 每年运行一次,1月1日午夜 | 0 0 0 1 1 * |
| @monthly | 每月运行一次,月初午夜 | 0 0 0 1 * * |
| @weekly | 每周运行一次,星期日午夜 | 0 0 0 * * 0 |
| @daily (或 @midnight) | 每天运行一次,午夜 | 0 0 0 * * * |
| @hourly | 每小时运行一次,整点开始 | 0 0 * * * * |
您也可以安排任务以固定间隔执行。通过以下格式的 cron 规范支持:
@every <duration>
其中 <duration> 是 time.ParseDuration 接受的字符串。
例如,@every 1h30m10s 表示每1小时30分钟10秒激活一次的计划。
注意:间隔不考虑任务运行时间。例如,如果一个任务需要 3分钟 运行,并且计划每 5分钟 运行一次,那么每次运行之间只有 2分钟 的空闲时间。
所有解释和调度都在机器的本地时区中完成(由 Go time 包 提供)。
请注意,在夏令时跳跃转换期间安排的任务将不会运行!
由于 Cron 服务与调用代码并发运行,必须注意确保适当的同步。
所有 cron 方法 都设计为正确同步,只要调用者确保调用之间有明确的先行发生排序。
Cron 条目存储在数组中,按其下次激活时间排序。Cron 休眠直到下一个任务应该运行。
唤醒时:
- 运行在该秒激活的每个条目
- 计算已运行任务的下次运行时间
- 按下次激活时间重新排序条目数组
- 休眠直到最早的任务
MIT License