1.介绍
在Linux
中,通过crontab
命令使任务在约定的时间执行已经计划好的工作,而Go
由于语言的特性,不适合直接使用crontab
来管理计划任务,cron (目前 Star8.3k)是一个用Go
实现的定时任务库,支持秒级定时任务,可以满足绝大多数工作场景需求。
2. 安装
go get github.com/robfig/cron/v3@v3.0.0
复制
3. 快速使用
package main
import (
"fmt"
"github.com/robfig/cron/v3"
"time"
)
func main() {
// 开启秒字段支持
c := cron.New(cron.WithSeconds())
// 传统表达式写法: 每秒执行一次
_, _ = c.AddFunc("0/1 * * * * *", func() {
fmt.Println("传统表达式: ",time.Now().Format("2006-01-02 15:04:05"))
})
// 预定义表达式
_,_ = c.AddFunc("@every 1s", func() {
fmt.Println("预定义表达式: ",time.Now().Format("2006-01-02 15:04:05"))
})
// 启动
c.Start()
// 防止程序直接退出
time.Sleep(time.Second * 3)
}
/**输出
预定义表达式: 2021-07-18 10:44:52
传统表达式: 2021-07-18 10:44:52
传统表达式: 2021-07-18 10:44:53
预定义表达式: 2021-07-18 10:44:53
传统表达式: 2021-07-18 10:44:54
预定义表达式: 2021-07-18 10:44:54
*/复制
4. 添加任务方式
4.1 通过AddFunc
具体使用,参见上面的快速使用案例
4.2 通过AddJob
1. 使用步骤
第一步:定义类型 第二步:实现 cron.Job
接口,即给自定义类型添加方法Run()
第三步:通过 AddJob
方法添加到定时任务
2. 使用示例
package main
import (
"fmt"
"github.com/robfig/cron/v3"
"time"
)
// 定义类型
type city struct {
Name string
}
// 实现cron.Job接口
func (s city) Run() {
fmt.Printf("%s时间:%v\n",s.Name,time.Now().Format("2006-01-02 15:04:05"))
}
func main() {
// 开启秒级别支持,默认支持最小粒度是分钟
c := cron.New(cron.WithSeconds())
// 添加定时任务
_, _ = c.AddJob("@every 1s", city{
Name: "北京",
})
// 启动
c.Start()
// 防止程序直接退出
for {}
}
/**输出
北京时间:2021-07-18 11:21:50
北京时间:2021-07-18 11:21:51
北京时间:2021-07-18 11:21:52
...
*/复制
5. 执行频率
5.1 cron时间表达式
@注意: cron默认支持最小粒度是分钟,若要支持秒级别,需要传入cron.WithSeconds()
来开启,开启后的cron时间表达式和Linux中的crontab时间表达式会有区别。
1. 开启秒级别后

2. 示例
@注意:下面表格示例,是在开启秒级级别支持情况下的写法。
表达式 | 说明 |
---|---|
* * * * * * | 每秒执行一次 |
0 */1 * * * * | 每分钟执行一次 |
0 0 */1 * * * | 每小时执行一次 |
0 0 0 */1 * * | 每天00:00 执行一次 |
0 30 23 */1 * * | 每天23:30 执行一次 |
0 0 0 1 */1 * | 每月的第一天执行 |
0 30 21 * * 1 | 每周一21:30 执行 |
5.2 预定义时间
1. 预表达式
上面通过表达式写,很容易会写错,还好cron
提供了预表达式,可以很方便各种场景的示例,具体如下:
表达式 | 描述 | 等式 |
---|---|---|
@yearly (or @annually) | 每年1月1日 00:00:00 执行一次 | 0 0 0 1 1 * |
@monthly | 每个月第一天的 00:00:00 执行一次 | 0 0 0 1 * * |
@weekly | 每周周六的 00:00:00 执行一次 | 0 0 0 * * 0 |
@daily (or @midnight) | 每天 00:00:00 执行一次 | 0 0 0 * * * |
@hourly | 每小时执行一次 | 0 0 * * * * |
@every duration | 指定时间间隔执行一次,如 @every 5s ,每隔5秒执行一次。 | 0/5 * * * * * |
2. 固定间隔(@every
)
@every duration
含义为每隔duration
触发一次。<duration>
会调用time.ParseDuration()
函数解析,所以ParseDuration
支持的格式都可以。单位为h(小时)、m(分钟)、s(秒)
表达式 | 说明 |
---|---|
@every 1s | 每秒钟执行一次 |
@every 1m | 每分钟执行一次 |
@every 1h | 每小时执行一次 |
@every 1h1m | 每小时一分钟执行一次 |
文章转载自猿码记,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。
评论
相关阅读
【专家观点】罗敏:从理论到真实SQL,感受DeepSeek如何做性能优化
墨天轮编辑部
1239次阅读
2025-03-06 16:45:38
【专家有话说第五期】在不同年龄段,DBA应该怎样规划自己的职业发展?
墨天轮编辑部
1219次阅读
2025-03-13 11:40:53
2025年2月国产数据库大事记
墨天轮编辑部
956次阅读
2025-03-05 12:27:34
2025年2月国产数据库中标情况一览:GoldenDB 3500+万!达梦近千万!
通讯员
849次阅读
2025-03-06 11:40:20
2月“墨力原创作者计划”获奖名单公布
墨天轮编辑部
439次阅读
2025-03-13 14:38:19
AI的优化能力,取决于你问问题的能力!
潇湘秦
408次阅读
2025-03-11 11:18:22
优炫数据库成功应用于国家电投集团青海海南州新能源电厂!
优炫软件
335次阅读
2025-03-21 10:34:08
达梦数据与法本信息签署战略合作协议
达梦数据
280次阅读
2025-03-06 09:26:57
国产化+性能王炸!这套国产方案让 3.5T 数据 5 小时“无感搬家”
YMatrix
267次阅读
2025-03-13 09:51:26
IBM收购数据库厂商DataStax:瞄准向量和AI搜索
深度数据云
259次阅读
2025-02-28 12:04:04