golang,go,博客,开源,编程
/robfig/cron
是 Go 语言中的一个流行的定时任务库,它实现了一个类似于 Unix/Linux 系统中的 cron
的功能,可以用来安排定时任务。该库使用 Go 的 time
包,并提供了一个非常易于使用的 API 来调度和管理任务。
要使用 robfig/cron
库,你需要先安装它。你可以通过以下命令来安装:
go get github.com/robfig/cron/v3
首先,你需要创建一个新的 cron
实例,使用 cron.New()
创建一个新的定时任务调度器。然后,你可以使用 AddFunc
或 AddJob
方法来注册任务。
package main
import (
"fmt"
"github.com/robfig/cron/v3"
"time"
)
func main() {
// 创建一个新的 Cron 调度器
c := cron.New()
// 注册一个定时任务,每 5 秒执行一次
c.AddFunc("*/5 * * * * *", func() {
fmt.Println("Task executed at", time.Now())
})
// 启动 Cron 调度器
c.Start()
// 防止主线程提前退出
select {}
}
cron.New()
创建了一个新的调度器。c.AddFunc("*/5 * * * * *", func() {...})
是定时任务的注册,*/5 * * * * *
是一个 Cron 表达式,表示每 5 秒执行一次。c.Start()
启动了调度器,开始执行定时任务。select {}
保证主程序不退出,这样定时任务能够继续运行。robfig/cron
库使用标准的 Cron 表达式,格式如下:
* * * * * *
- - - - - -
| | | | | |
| | | | | +-- Day of week (0 - 6) (Sunday=0)
| | | | +---- Month (1 - 12)
| | | +------ Day of month (1 - 31)
| | +-------- Hour (0 - 23)
| +---------- Minute (0 - 59)
+------------ Second (0 - 59)
常见的 Cron 表达式示例:
"*/5 * * * * *"
: 每 5 秒执行一次。"0 * * * * *"
: 每小时的第 0 分钟(即每小时执行一次)。"0 0 * * * *"
: 每天午夜 12 点执行。"0 0 1 * * *"
: 每月 1 号午夜执行。你可以在同一个 cron
调度器中添加多个任务,它们会根据各自的 Cron 表达式按时执行。
package main
import (
"fmt"
"github.com/robfig/cron/v3"
"time"
)
func main() {
// 创建一个新的 Cron 调度器
c := cron.New()
// 注册一个定时任务,每 10 秒执行一次
c.AddFunc("*/10 * * * * *", func() {
fmt.Println("Task 1 executed at", time.Now())
})
// 注册另一个定时任务,每 15 秒执行一次
c.AddFunc("*/15 * * * * *", func() {
fmt.Println("Task 2 executed at", time.Now())
})
// 启动 Cron 调度器
c.Start()
// 防止主线程提前退出
select {}
}
AddJob
注册任务除了直接注册函数,你还可以注册实现了 cron.Job
接口的对象。cron.Job
接口只有一个方法 Run()
,你需要实现这个方法来定义任务逻辑。
AddJob
注册任务package main
import (
"fmt"
"github.com/robfig/cron/v3"
"time"
)
// 实现 cron.Job 接口
type MyJob struct{}
func (m *MyJob) Run() {
fmt.Println("Custom job executed at", time.Now())
}
func main() {
// 创建一个新的 Cron 调度器
c := cron.New()
// 注册自定义任务
c.AddJob("*/10 * * * * *", &MyJob{})
// 启动 Cron 调度器
c.Start()
// 防止主线程提前退出
select {}
}
你可以暂停、停止或重新启动调度器。
package main
import (
"fmt"
"github.com/robfig/cron/v3"
"time"
)
func main() {
// 创建一个新的 Cron 调度器
c := cron.New()
// 注册定时任务
c.AddFunc("*/5 * * * * *", func() {
fmt.Println("Task executed at", time.Now())
})
// 启动 Cron 调度器
c.Start()
// 暂停 15 秒钟
time.Sleep(15 * time.Second)
// 停止 Cron 调度器
c.Stop()
fmt.Println("Cron scheduler stopped")
}
c.Stop()
停止 Cron 调度器,所有任务将不再执行。你还可以使用 time
包来动态生成时间段,进而生成 Cron 表达式。
package main
import (
"fmt"
"github.com/robfig/cron/v3"
"time"
)
func main() {
// 获取当前时间
now := time.Now()
fmt.Println("Current time:", now)
// 根据当前时间动态生成一个 Cron 表达式
cronExpr := fmt.Sprintf("%d %d * * * *", now.Second(), now.Minute())
// 创建一个新的 Cron 调度器
c := cron.New()
// 注册一个任务,每分钟的第 5 秒执行
c.AddFunc(cronExpr, func() {
fmt.Println("Dynamic task executed at", time.Now())
})
// 启动 Cron 调度器
c.Start()
// 防止主线程提前退出
select {}
}
当定时任务出现错误时,cron
调度器会记录错误日志。你可以使用 c.AddFunc
和 c.AddJob
来捕获错误,并进行适当的错误处理。
package main
import (
"fmt"
"github.com/robfig/cron/v3"
"log"
"time"
)
func main() {
// 创建一个新的 Cron 调度器
c := cron.New()
// 注册一个带错误处理的任务
c.AddFunc("*/5 * * * * *", func() {
defer func() {
if err := recover(); err != nil {
log.Println("Task failed:", err)
}
}()
// 模拟任务错误
panic("Something went wrong")
})
// 启动 Cron 调度器
c.Start()
// 防止主线程提前退出
select {}
}
robfig/cron
是 Go 中一个非常强大的定时任务调度库,支持 cron 表达式和多种任务调度方式。robfig/cron
的核心,灵活地表达任务的调度周期。