1. 介绍
Golang cron 库是一个强大且易于使用的工具,允许在特定时间或间隔内调度任务运行。它是模仿 UNIX cron 服务设计的,但实现为一个独立的库,可以集成到 Go 应用程序中。cron 库负责基于时间的调度,让您可以专注于需要执行的任务。
2. 示例
安装 cron 库
要开始在项目中使用 cron 库,您需要首先使用 go get
命令进行安装:
go get github.com/robfig/cron/v3@v3.0.0
导入 cron 包
安装后,您可以按以下方式将其导入到您的 Go 程序中:
import "github.com/robfig/cron/v3"
以下是一个设置 Cron 作业以每分钟打印一条消息的简单示例:
package main
import (
"fmt"
"github.com/robfig/cron/v3"
)
func main() {
c := cron.New()
c.AddFunc("0 30 * * * *", func() { fmt.Println("每半个小时") })
c.AddFunc("@hourly", func() { fmt.Println("每小时") })
c.AddFunc("@every 1h30m", func() { fmt.Println("每小时三十分钟") })
c.Start()
..
// Funcs are invoked in their own goroutine, asynchronously.
...
// Funcs may also be added to a running Cron
c.AddFunc("@daily", func() { fmt.Println("每天") })
..
..
c.Stop() // 停止调度器(不会停止已经运行的任何作业)。
}
3. CRON 表达式格式
cron 表达式代表一组时间,使用 6 个以空格分隔的字段。
字段 | 是否必须? | 允许的值 | 允许的特殊字符 |
---|---|---|---|
秒 | 是 | 0-59 | * / , - |
分 | 是 | 0-59 | * / , - |
小时 | 是 | 0-23 | * / , - |
一个月的第几天 | 是 | 1-31 | * / , - ? |
月份 | 是 | 1-12 或 JAN-DEC | * / , - |
一周的第几天 | 是 | 0-6 或 SUN-SAT | * / , - ? |
4. CRON 表达式中的特殊字符
- 星号(*) 星号代表给定字段的所有可能值。例如,分钟字段中的星号表示每分钟。
- 斜杠(/) 斜杠字符用于指定增量。例如,秒字段中的 "*/15" 表示从零开始,每 15 秒运行一次。
- 逗号(,) 逗号字符用于列出多个不连续的值。例如,一周中的 "MON, WED, FRI" 表示作业将在星期一、星期三和星期五运行。
- 连字符(-) 连字符表示一系列值。“9-17” 在小时字段中表示从上午 9 点到下午 5 点的每小时。
- 问号(?) 问号可以在一个月中的日期和一周中的日期字段中使用,表示“没有特定值”,这在您需要为一个指定值而不是另一个指定值时非常有用。
5. 预定义的计划
预定义计划的详细解释可在以下表格中找到:
条目 | 描述 | 等同于 |
---|---|---|
@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 * * * * |
6. 时间间隔和固定间隔调度
使用cron库调度作业在固定时间间隔内执行是其另一个强大的功能。例如,要安排每2小时运行一次的作业:
c.AddFunc("@every 2h", func() { fmt.Println("每两小时运行一次作业") })
7. 时区和作业调度
解释和调度是在运行Go应用程序的计算机的本地时区中完成的。在夏令时更改期间,需要注意某些时间可能不存在或重复。
8. 线程安全和同步
cron库被设计为线程安全和并发的。调用者必须维护正确的方法调用顺序,以避免竞态条件。必须在必要时使用适当的同步机制,以确保作业被正确地调度和执行。