当前位置: 首页 > 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.jsqmd.com/news/19321/

相关文章:

  • poll 函数原理与 TCP 服务器构建详解
  • Android 应用多模块开发时,子模块只有 release buildType 时编译报错怎么办?
  • ipad协议对个人微信机器人进行二次开发
  • 西安交通大学国家级医学公关交叉平台实验室建设实拍图
  • 2025年10月智能门窗代理厂家全景解析报告,基于专业测评的技术、性能及市场优势深度分析
  • 深入解析:【ROS2学习笔记】话题通信篇:话题通信再探
  • 完整教程:Python全栈(基础篇)——Day06:后端内容(定义函数+调用函数+实战演示+每日一题)
  • 【IEEE出版、中国科学院宁波材料所主办】第五届机械自动化与电子信息工程国际学术会议(MAEIE 2025)
  • 氛围灯动态屏保取色方案二
  • 完整教程:Oracle/MySQL/SqlServer/PostgreSQL等数据库的数据类型映射以及各版本数据类型情况说明
  • 老弟第一次学 Redis,被坑惨了!小白可懂的保姆级 Redis 教程
  • 中小企业如何低成本部署电话呼叫软件网页版?一步步教你做
  • 别再手写过滤器!SpringCloud Gateway 内置30 个,少写 80% 重复代码
  • PCB库文档处理工具
  • 完整教程:如何更改 SQLserver 数据库存储的位置 想从C盘换到D盘
  • 实用指南:Linux 如何创建和计数套接字
  • (web cad drawing)Web CAD SDK Integration Method
  • 记一次 .NET 某药品缺陷高速检测系统 卡慢分析
  • 0254-CLAP-参数默认值
  • 得物火山引擎:Data Agent驱动财务管理智能升级
  • WPF/C#:使用Stylet中的IWindowManager用于显示等待窗体、对话框与消息框
  • 2025年钢花钢管厂家最新行业资讯推荐,注浆钢管/超前小导钢管/袖阀钢管/地质钢管/管棚钢管/岩心钢管/基建与矿业升级驱动需求,高品质钢管如何选?最新实力厂商推荐榜发布
  • 训练常用
  • 《Vuejs设计与实现》第 18 章(同构渲染)(上) - 详解
  • 配置git
  • 0253-CLAP-统计参数出现次数
  • 什么情况下有必要使用抽象基类ABC?
  • 实用指南:TensorFlow2 Python深度学习 - 深度学习概述
  • HTTP/2协议漏洞引发史上最大DDoS攻击——Rapid Reset技术深度解析
  • 因果机器学习模型实战测试与比较