- 🔍 Cron 表达式
- 💡 核心特性与用法
- 预定义模式与间隔
- 基本使用步骤
- 时区设置
- 高级选项
- 简单示例
- ⚠️ 版本注意与总结
Golang 的 cron 库用于处理定时任务,其中 github.com/robfig/cron/v3 是一个广泛使用的、功能丰富的库,它支持标准的 cron 表达式,并且易于使用。
🔍 Cron 表达式
robfig/cron/v3 库支持标准的 cron 表达式来定义任务计划。表达式由 5 个或 6 个时间字段组成(取决于是否启用秒级精度),各字段含义如下:
| 字段 | 是否强制 | 允许值 | 允许的特殊字符 |
|---|---|---|---|
| Seconds | 可选 | 0-59 | * / , - |
| Minutes | 是 | 0-59 | * / , - |
| Hours | 是 | 0-23 | * / , - |
| Day of month | 是 | 1-31 | * / , - ? L W |
| Month | 是 | 1-12 或 JAN-DEC | * / , - |
| Day of week | 是 | 0-6 或 SUN-SAT | * / , - ? L # |
特殊字符的含义:
*:匹配该字段的所有值。/:用于指定步长,例如*/5 * * * * *表示每 5 秒执行一次。,:用于列出多个值,例如* * 5,10,15 3,4 * *表示三月或四月的 5、10、15 日执行。-:用于指定一个范围,例如*/5 * 10-12 * * *表示每天 10 点到 12 点每 5 秒执行一次。?:用于替代*,通常在“日期”和“星期”字段中用于避免冲突。
💡 核心特性与用法
robfig/cron/v3 库提供了以下核心功能:
- 灵活的时间表达式:除了标准的 cron 表达式,还支持预定义模式和间隔描述符。
- 任务管理:可以动态添加、移除任务,并控制调度器的启动与停止。
- 可扩展性:支持通过装饰器模式添加日志、恢复等功能。
预定义模式与间隔
为了简化配置,库提供了一些预定义的模式:
@yearly或@annually:每年执行一次,等同于0 0 1 1 *。@monthly:每月执行一次,等同于0 0 1 * *。@weekly:每周执行一次,等同于0 0 * * 0。@daily或@midnight:每天执行一次,等同于0 0 * * *。@hourly:每小时执行一次,等同于0 * * * *。@every <duration>:每隔指定的 duration 执行一次,例如@every 10s表示每隔 10 秒执行。<duration>会被time.ParseDuration解析,支持如1h30m10s这样的格式。
基本使用步骤
-
创建 Cron 实例:
c := cron.New()如果需要秒级精度,可以使用
cron.WithSeconds()选项:c := cron.New(cron.WithSeconds())此时 cron 表达式为 6 位(秒 分 时 日 月 周)。
-
添加任务:
使用AddFunc方法添加任务,指定时间表达式和要执行的函数。c.AddFunc("0 30 * * * *", func() { fmt.Println("每小时的第30分钟执行") })也可以使用
AddJob方法添加实现了Job接口(需实现Run()方法)的对象。 -
启动与停止:
c.Start() // 启动调度器 // ... c.Stop() // 停止调度器,注意已开始的任务会继续执行完毕由于
c.Start()会启动新的 goroutine 执行调度,主程序需要设法保持运行(例如使用select {}或time.Sleep)。
时区设置
默认情况下,所有时间基于当前时区。你可以通过以下方式指定时区:
nyc, _ := time.LoadLocation("America/New_York")
c := cron.New(cron.WithLocation(nyc))
或者在时间字符串前添加 CRON_TZ 前缀。
高级选项
- 日志记录:可以集成自定义 Logger。
c := cron.New(cron.WithLogger(cron.PrintfLogger(log.New(os.Stdout, "CRON: ", log.LstdFlags)),), ) - 任务恢复:使用
cron.WithChain和cron.Recover可以在任务发生 panic 时恢复。
简单示例
下面是一个简单的示例,演示了如何使用 robfig/cron/v3 创建定时任务:
package mainimport ("fmt""log""os""time""github.com/robfig/cron/v3"
)func main() {c := cron.New(cron.WithLogger(cron.VerbosePrintfLogger(log.New(os.Stdout, "cron: ", log.LstdFlags)),),)// 添加一个每秒执行的任务c.AddFunc("@every 1s", func() {fmt.Println("每秒执行的任务", time.Now())})// 添加一个每分钟第30秒执行的任务c.AddFunc("30 * * * * *", func() {fmt.Println("每分钟第30秒执行的任务", time.Now())})c.Start()defer c.Stop()// 保持程序运行select {}
}
⚠️ 版本注意与总结
需要注意的是,robfig/cron 库有 v1 和 v3 等主要版本,它们在 API 和默认行为上有所不同(例如 v3 默认不支持秒级精度,需通过 cron.WithSeconds() 开启)。建议使用 v3 版本,并在引入时指定版本号:
import "github.com/robfig/cron/v3"
robfig/cron/v3 是一个设计良好、功能全面且可靠的 Golang 定时任务库。通过掌握其核心概念和使用方法,你可以轻松地在你的 Go 应用程序中实现各种复杂的定时任务调度。
希望这些信息能帮助你更好地理解和使用 Golang 的 cron 库!如果你对特定场景下的用法有更多疑问,我很乐意进一步探讨。
