Go 常用包: 定時任務管理 Cron

  1. 介紹

Linux中,通過crontab命令使任務在約定的時間執行已經計劃好的工作,而Go由於語言的特性,不適合直接使用crontab來管理計劃任務,cron (目前 Star8.3k) 是一個用Go實現的定時任務庫,支持秒級定時任務,可以滿足絕大多數工作場景需求。

  1. 安裝

go get github.com/robfig/cron/v3@v3.0.0
  1. 快速使用

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
*/
  1. 添加任務方式

4.1 通過AddFunc

具體使用,參見上面的快速使用案例

4.2 通過AddJob

1. 使用步驟

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
...
*/
  1. 執行頻率

5.1 cron 時間表達式

@注意: cron 默認支持最小粒度是分鐘,若要支持秒級別, 需要傳入cron.WithSeconds()來開啓, 開啓後的 cron 時間表達式和 Linux 中的 crontab 時間表達式會有區別。

1. 開啓秒級別後

2. 示例

@注意:下面表格示例,是在開啓秒級級別支持情況下的寫法。

NHq3Hf

5.2 預定義時間

1. 預表達式

上面通過表達式寫,很容易會寫錯,還好cron提供了預表達式,可以很方便各種場景的示例, 具體如下:

pccayp

2. 固定間隔 (@every)

@every duration含義爲每隔duration觸發一次。<duration>會調用time.ParseDuration()函數解析,所以ParseDuration支持的格式都可以。單位爲h(小時)、m(分鐘)、s(秒)

1GL2DM

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/Xs70xVsuXLZVmfMRn_NplA