corn
在 Go 中,cron 通常用于表示定时任务的调度器,类似于 Unix/Linux 系统中的 cron 工具。通过定时调度器,可以定期执行某些任务,如清理日志、定时备份、定时发送邮件等。
Go 标准库没有内置支持 Cron 的功能,但是可以使用第三方库来实现类似的功能。最常用的库之一是 robfig/cron,它提供了一个类似 Unix cron 表达式的调度器,能够精确控制任务的执行时间。
1. 安装 robfig/cron 库
你可以通过以下命令安装 robfig/cron 库:
bash
go get github.com/robfig/cron/v32. 使用 robfig/cron 实现定时任务
robfig/cron 允许你使用 Cron 表达式来定义定时任务。Cron 表达式的格式如下:
* * * * * <command-to-execute>
- - - - -
| | | | |
| | | | +---- Day of the week (0 - 7) (Sunday = 0 or 7)
| | | +--------- Month (1 - 12)
| | +-------------- Day of the month (1 - 31)
| +------------------- Hour (0 - 23)
+------------------------ Minute (0 - 59)2.1 基本使用示例
go
package main
import (
"fmt"
"github.com/robfig/cron/v3"
"time"
)
func main() {
// 创建一个新的 Cron 调度器
c := cron.New()
// 定义一个任务:每分钟执行一次
_, err := c.AddFunc("@every 1m", func() {
fmt.Println("Task executed at:", time.Now())
})
if err != nil {
fmt.Println("Error adding cron job:", err)
return
}
// 启动 Cron 调度器
c.Start()
// 让主程序等待
select {}
}在这个示例中:
cron.New():创建一个新的 Cron 调度器实例。c.AddFunc("@every 1m", ...):添加一个定时任务,@every 1m是一个简化的 Cron 表达式,表示每 1 分钟执行一次。你也可以使用标准的 Cron 表达式,如"0 0 * * *",表示每天午夜执行一次。c.Start():启动 Cron 调度器,开始执行定时任务。select {}:主线程阻塞,以保持程序持续运行,避免程序退出。
2.2 使用 Cron 表达式
你可以使用标准的 Cron 表达式来定义任务的执行频率。例如:
"0 0 * * *":每天午夜执行。"*/5 * * * *":每 5 分钟执行一次。"0 9-17 * * 1-5":每周一到周五,上午 9 点到下午 5 点的每小时执行一次。
以下是使用标准 Cron 表达式的示例:
go
package main
import (
"fmt"
"github.com/robfig/cron/v3"
"time"
)
func main() {
// 创建一个新的 Cron 调度器
c := cron.New()
// 使用 Cron 表达式:每天凌晨 1 点执行任务
_, err := c.AddFunc("0 1 * * *", func() {
fmt.Println("Daily task executed at:", time.Now())
})
if err != nil {
fmt.Println("Error adding cron job:", err)
return
}
// 启动 Cron 调度器
c.Start()
// 让主程序等待
select {}
}2.3 定时任务的停止与管理
你可以在程序中动态管理任务,例如暂停、取消定时任务。
go
package main
import (
"fmt"
"github.com/robfig/cron/v3"
"time"
)
func main() {
// 创建一个新的 Cron 调度器
c := cron.New()
// 添加定时任务
jobID, err := c.AddFunc("*/5 * * * *", func() {
fmt.Println("Task executed at:", time.Now())
})
if err != nil {
fmt.Println("Error adding cron job:", err)
return
}
// 启动 Cron 调度器
c.Start()
// 模拟 15 秒后停止任务
time.Sleep(15 * time.Second)
// 取消定时任务
c.Remove(jobID)
fmt.Println("Task removed")
// 让主程序等待
select {}
}在这个示例中:
jobID, err := c.AddFunc(...):添加任务并返回任务 ID。c.Remove(jobID):使用任务 ID 移除已经添加的任务。
2.4 执行一次任务(非周期性)
如果你只希望任务执行一次,可以使用 AddFunc 添加一个立即执行的任务。通过传入 @once 来表示任务只执行一次。
go
package main
import (
"fmt"
"github.com/robfig/cron/v3"
"time"
)
func main() {
// 创建一个新的 Cron 调度器
c := cron.New()
// 定义一次性任务
_, err := c.AddFunc("@once", func() {
fmt.Println("This task runs once at:", time.Now())
})
if err != nil {
fmt.Println("Error adding cron job:", err)
return
}
// 启动 Cron 调度器
c.Start()
// 让主程序等待
select {}
}在这个示例中,@once 表示任务只会在 Cron 启动时立即执行一次。
3. 其他 Cron 表达式示例
@every 1h:每小时执行一次。0 0 1 * *:每月的第一天执行一次。*/15 * * * *:每 15 分钟执行一次。
4. 总结
robfig/cron 是 Go 中最常用的第三方库,用于实现定时任务调度。它支持标准的 Cron 表达式,允许你灵活地控制任务的执行时间。通过 Cron,你可以轻松地实现定期任务、延迟任务和一次性任务等。
常见的应用场景包括:
- 定期执行清理任务(例如清理临时文件)。
- 定时备份数据库或文件。
- 定期发送报告或邮件提醒。
安装命令:
bash
go get github.com/robfig/cron/v3