Go 常用包: 定時任務管理 Cron
- 介紹
在Linux
中,通過crontab
命令使任務在約定的時間執行已經計劃好的工作,而Go
由於語言的特性,不適合直接使用crontab
來管理計劃任務,cron (目前 Star8.3k) 是一個用Go
實現的定時任務庫,支持秒級定時任務,可以滿足絕大多數工作場景需求。
- 安裝
go get github.com/robfig/cron/v3@v3.0.0
- 快速使用
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.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.1 cron 時間表達式
@注意: cron 默認支持最小粒度是分鐘,若要支持秒級別, 需要傳入cron.WithSeconds()
來開啓, 開啓後的 cron 時間表達式和 Linux 中的 crontab 時間表達式會有區別。
1. 開啓秒級別後
2. 示例
@注意:下面表格示例,是在開啓秒級級別支持情況下的寫法。
5.2 預定義時間
1. 預表達式
上面通過表達式寫,很容易會寫錯,還好cron
提供了預表達式,可以很方便各種場景的示例, 具體如下:
2. 固定間隔 (@every
)
@every duration
含義爲每隔duration
觸發一次。<duration>
會調用time.ParseDuration()
函數解析,所以ParseDuration
支持的格式都可以。單位爲h(小時)、m(分鐘)、s(秒)
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/Xs70xVsuXLZVmfMRn_NplA