当前位置: 首页 > news >正文

Golang的 cron 库

目录
  • 🔍 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 这样的格式。

基本使用步骤

  1. 创建 Cron 实例

    c := cron.New()
    

    如果需要秒级精度,可以使用 cron.WithSeconds() 选项:

    c := cron.New(cron.WithSeconds())
    

    此时 cron 表达式为 6 位(秒 分 时 日 月 周)。

  2. 添加任务
    使用 AddFunc 方法添加任务,指定时间表达式和要执行的函数。

    c.AddFunc("0 30 * * * *", func() { fmt.Println("每小时的第30分钟执行") 
    })
    

    也可以使用 AddJob 方法添加实现了 Job 接口(需实现 Run() 方法)的对象。

  3. 启动与停止

    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.WithChaincron.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 库!如果你对特定场景下的用法有更多疑问,我很乐意进一步探讨。

http://www.gsyq.cn/news/27249.html

相关文章:

  • 2025年10月智能门窗代理厂家全景解析报告,基于专业测评的技术、性能及市场优势深度分析
  • Android插件化框架
  • 完整教程:Python全栈(基础篇)——Day06:后端内容(定义函数+调用函数+实战演示+每日一题)
  • 完整教程:Oracle/MySQL/SqlServer/PostgreSQL等数据库的数据类型映射以及各版本数据类型情况说明
  • 中小企业如何低成本部署电话呼叫软件网页版?一步步教你做
  • 配置git
  • Vscode误删文件如何恢复(二)?
  • 中国企业DevOps工具链选型标准深度解析:云原生与开源生态的博弈
  • 在PySide6/PyQt6的开发框架中,增加对表格多种格式录入的处理,以及主从表的数据显示和保存操作。
  • 笔记本电脑如何连接打印机?安装指南分享给你!
  • 技术团队负责人咨询AI数智化升级改造路径
  • 2025 年胶条厂家最新推荐排行榜:聚焦密封 / 系统门窗 / 环保领域,森特达领衔优质品牌榜单EPDM/硫化焊接/门窗复合/门窗幕墙胶条厂家推荐
  • Go 开发即时通讯服务端完整教程
  • Python 中 的 “.” 是分隔符还是运算符,都可以怎么用?
  • 国产项目管理工具Gitee如何以本土化优势领跑企业级市场?
  • 2025 年最新工矿灯生产厂家口碑推荐榜:精选 LED/防爆/高光效等多类型产品,助力企业选出实力与品质兼具的照明品牌
  • 2025.10.21 NOIP模拟赛
  • 基于GIS的林业数据资源管理驾驶舱
  • 2025年10月抗老面霜评测榜:紧致提亮真实数据排行
  • PWM实现LED渐变效果及彩灯控制
  • 数据挖掘之人工智能与机器学习
  • 2025年DevSecOps工具生态全景观察:从代码托管到安全左移的实践演进
  • 华为荣耀笔记本演示机样机解锁带原装F10智能还原功能 - 指南
  • 产品经理必看!在线白板如何嵌入产品经理工作流
  • 2025年VOC检测仪厂家权威推荐榜:在线式VOC,固定式VOC,便携式VOC,手持式VOC,工业VOC检测仪专业选购指南
  • 服务器同步软件是什么?主要有哪几种类型?
  • 内外网数据安全交换:提升企业信息安全的关键解决方案
  • 基于MSP430单片机与DS3231时钟芯片的开发
  • 2025年10月工程管理系统推荐榜:斗栱云领衔十强对比
  • 2025年10月AI搜索营销推荐:权威评测十强榜单全解析