Golang的 cron 库

news/2025/10/22 11:33:41/文章来源:https://www.cnblogs.com/yubo-guan/p/19157551

目录
  • 🔍 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.mzph.cn/news/943219.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

poll 函数原理与 TCP 服务器构建详解

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

Android 应用多模块开发时,子模块只有 release buildType 时编译报错怎么办?

非常好的问题 👏,而且你这个需求其实是 最常见、最合理 的做法。 你完全正确 —— 如果你的模块(library modules)只需要 release(正式版)构建,而 app 有多个 buildType(比如 dev, prod 等),你 不需要 在每…

ipad协议对个人微信机器人进行二次开发

ipad协议对个人微信机器人进行二次开发、个微协议,微信号二次开发/ipad协议 优势 我们是一家专业服务企业数字化微信管理服务的技术团队,服务于需求SCRM、机器人、营销系统、社群小助手等具有研发能力的企业,同时我们…

西安交通大学国家级医学公关交叉平台实验室建设实拍图

在西安交通大学创新港,医学板块科研平台建设正以“加速度” 推进。 实验室现场,通风管道改造已完工,崭新的地面和实验台通风柜等实验室家具布局井然有序。

2025年10月智能门窗代理厂家全景解析报告,基于专业测评的技术、性能及市场优势深度分析

随着智能家居市场的快速发展,智能门窗行业迎来了快速增长期。据行业统计数据显示,2024年中国智能门窗市场规模预计突破800亿元,年复合增长率保持在18%以上。消费者对智能门窗的需求已从基础功能向智能化、安全性、节…

深入解析:【ROS2学习笔记】话题通信篇:话题通信再探

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

Android插件化框架

https://chat.deepseek.com/share/w6duumv7aglpslahak Android插件化框架Shadow深度解析 1. 什么是Android插件化? 1.1 基本概念 Android插件化是一种技术,允许一个已安装的APP(称为宿主)动态加载并运行另一个完整…

完整教程:Python全栈(基础篇)——Day06:后端内容(定义函数+调用函数+实战演示+每日一题)

完整教程:Python全栈(基础篇)——Day06:后端内容(定义函数+调用函数+实战演示+每日一题)pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !importa…

【IEEE出版、中国科学院宁波材料所主办】第五届机械自动化与电子信息工程国际学术会议(MAEIE 2025)

IEEE出版、会议规模大,EI检索 第五届机械自动化与电子信息工程国际学术会议(MAEIE 2025) 2025 5th International Conference on Mechanical Automation and Electronic Information Engineering 在这里看会议官网详…

氛围灯动态屏保取色方案二

氛围灯动态屏保取色方案二hue查找:整体偏差不会很大,但是对于亮度较高存在误差,精准度不够 lab查找:整体一般,但是精准度较好,不过算法复杂,增加耗时 hue色相查找存在误差,在有限的256色中,匹配的规则需要调整…

完整教程:Oracle/MySQL/SqlServer/PostgreSQL等数据库的数据类型映射以及各版本数据类型情况说明

完整教程:Oracle/MySQL/SqlServer/PostgreSQL等数据库的数据类型映射以及各版本数据类型情况说明2025-10-22 11:20 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !i…

老弟第一次学 Redis,被坑惨了!小白可懂的保姆级 Redis 教程

这天,产品经理找到你:阿巴阿巴,用户吐槽咱们网站首页加载太慢,快优化!你是小阿巴,刚入职的程序员。 这天,产品经理找到你:阿巴阿巴,用户吐槽咱们网站首页加载太慢,快优化! 你打开监控一看,好家伙!每秒有…

中小企业如何低成本部署电话呼叫软件网页版?一步步教你做

对于许多中小企业而言,电话沟通依然是销售、客服、售后等场景中最直接、最高效的方式。但当业务量增长、员工分布分散后,传统电话模式的问题也随之暴露:号码分散难管理、通话费用高、数据无法留存、外呼行为缺乏监管…

别再手写过滤器!SpringCloud Gateway 内置30 个,少写 80% 重复代码

大家好,我是小富~ 我发现公司的网关项目里有很多的轮子,几乎每个人接手这个项目开发,都会自定义过滤器,导致有非常非常多的过滤器,修改其中一个,指不定就会影响其他的人功能,非常的恼火。 其实在 Spring Cloud…

PCB库文档处理工具

PCB库文档处理工具封装库文档图元清理工具

完整教程:如何更改 SQLserver 数据库存储的位置 想从C盘换到D盘

完整教程:如何更改 SQLserver 数据库存储的位置 想从C盘换到D盘pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "C…

实用指南:Linux 如何创建和计数套接字

实用指南:Linux 如何创建和计数套接字pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Mon…

(web cad drawing)Web CAD SDK Integration Method

Preface We have created an online CAD project based on mxcad, which includes various CAD functions such as previewing, editing drawings, and operating the drawing database. After user integration, it s…

记一次 .NET 某药品缺陷高速检测系统 卡慢分析

一:背景 1. 讲故事 上个月有位朋友找到我,说他们公司的程序当内存达到一定阈值(2g+)之后,业务逻辑明显变慢导致下位机超时报警,想让我看下到底怎么回事,这种问题其实抓dump比较难搞,但朋友也说了有一个增长阈值,…

0254-CLAP-参数默认值

环境Time 2022-12-02 WSL-Ubuntu 22.04 CLAP 4.0.29前言 说明 参考:https://docs.rs/clap/latest/clap/index.html 目标 如果没有提供参数,使用默认值。 Cargo.toml [package] edition = "2021" name = &q…