当前位置: 首页 > 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.hskmm.com/?act=detail&tid=36483

相关文章:

  • 实用指南:Linux 如何创建和计数套接字
  • 中小企业如何低成本部署电话呼叫软件网页版?一步步教你做
  • 别再手写过滤器!SpringCloud Gateway 内置30 个,少写 80% 重复代码
  • 记一次 .NET 某药品缺陷高速检测系统 卡慢分析
  • 0254-CLAP-参数默认值
  • 得物火山引擎:Data Agent驱动财务管理智能升级
  • WPF/C#:使用Stylet中的IWindowManager用于显示等待窗体、对话框与消息框
  • Flask笔记
  • 0253-CLAP-统计参数出现次数
  • 《Vuejs设计与实现》第 18 章(同构渲染)(上) - 详解
  • 配置git
  • 01-C程序设计语言-第2版-第1章导言笔记
  • 0252-CLAP-标记类型的参数
  • 记录我适配iOS26遇到的一些问题
  • 什么情况下有必要使用抽象基类ABC?
  • 0251-CLAP-使用 Cargo 配置
  • vscode安装element报错
  • 2025 年最新推荐!论文发表机构口碑重磅发布,覆盖 SCI / 核心等多领域助你高效发表毕业/SSCI/SCI期刊/核心期刊论文发表机构推荐
  • 2025 年期刊发表机构最新推荐口碑排行榜:覆盖 SCI/SSCI/ 核心期刊,助力科研人员高效选靠谱平台核心期刊发表/国际期刊发表机构推荐
  • 因果机器学习模型实战测试与比较
  • 笔记本电脑如何连接打印机?安装指南分享给你!
  • 2025 年麦克风厂家最新推荐榜单:覆盖娱乐 / 演出 / 直播 / 会议多场景,精选技术领先口碑优良品牌助力采购
  • 【2025-10-21】维护关系
  • 【Github热门项目】DeepSeek-OCR项目上线即突破7k+星!突破10倍无损压缩,重新定义文本-视觉信息处理
  • MATLAB 的无人机 PID 控制及智能 PID 控制器设计的仿真
  • 2025年口碑好的直角支架铝型材深加工,工业铝型材深加工工厂-江苏龙新铝业
  • 2025 年最新工矿灯生产厂家口碑推荐榜:精选 LED/防爆/高光效等多类型产品,助力企业选出实力与品质兼具的照明品牌
  • 2025年10月胰腺癌治疗医生对比榜:五名专家深度解析
  • 2025年10月胰腺癌治疗医生榜单:五强排名与实用决策指南
  • FreeSql 迁移表结构 (非严谨版)