亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

Go語言版crontab

2019-11-11 03:02:13
字體:
來源:轉載
供稿:網友

1、cron 表達式的基本格式

用過 linux 的應該對 cron 有所了解。linux 中可以通過 crontab -e 來配置定時任務。不過,linux 中的 cron 只能精確到分鐘。而我們這里要討論的 Go 實現的 cron 可以精確到秒,除了這點比較大的區別外,cron 表達式的基本語法是類似的。(如果使用過 java 中的 Quartz,對 cron 表達式應該比較了解,而且它和這里我們將要討論的 Go 版 cron 很像,也都精確到秒)

cron(計劃任務),顧名思義,按照約定的時間,定時的執行特定的任務(job)。cron 表達式 表達了這種約定。

cron 表達式代表了一個時間集合,使用 6 個空格分隔的字段表示。

字段名是否必須允許的值允許的特定字符
秒(Seconds)0-59* / , -
分(Minutes)0-59* / , -
時(Hours)0-23* / , -
日(Day of month)1-31* / , – ?
月(Month)1-12 or JAN-DEC* / , -
星期(Day of week)0-6 or SUM-SAT* / , – ?

注:1)月(Month)和星期(Day of week)字段的值不區分大小寫,如:SUN、Sun 和 sun 是一樣的。2)星期(Day of week)字段如果沒提供,相當于是 *

2、特殊字符說明

1)星號(*)

表示 cron 表達式能匹配該字段的所有值。如在第5個字段使用星號(month),表示每個月

2)斜線(/)

表示增長間隔,如第1個字段(minutes) 值是 3-59/15,表示每小時的第3分鐘開始執行一次,之后每隔 15 分鐘執行一次(即 3、18、33、48 這些時間點執行),這里也可以表示為:3/15

3)逗號(,)

用于枚舉值,如第6個字段值是 MON,WED,FRI,表示 星期一、三、五 執行

4)連字號(-)

表示一個范圍,如第3個字段的值為 9-17 表示 9am 到 5pm 直接每個小時(包括9和17)

5)問號(?)

只用于 日(Day of month) 和 星期(Day of week),表示不指定值,可以用于代替 *

3、主要類型或接口說明

1)Cron:包含一系列要執行的實體;支持暫?!緎top】;添加實體等

1type Cron struct{
2    entries  []*Entry
3    stop     chan struct{}  // 控制 Cron 實例暫停
4    add      chan *Entry     // 當 Cron 已經運行了,增加新的 Entity 是通過 add 這個 channel 實現的
5    snapshot chan []*Entry   // 獲取當前所有 entity 的快照
6    running bool           // 當已經運行時為true;否則為false
7}

注意,Cron 結構沒有導出任何成員。

注意:有一個成員 stop,類型是 struct{},即空結構體。

2)Entry:調度實體

1type Entry struct{
2    // The schedule on which this job should be run.
3    // 負責調度當前 Entity 中的 Job 執行
4    Schedule Schedule
5 
6    // The next time the job will run. This is the zero time if Cron has not been
7    // started or this entry's schedule is unsatisfiable
8    // Job 下一次執行的時間
9    Nexttime.Time
10 
11    // The last time this job was run. This is the zero time if the job has never
12    // been run.
13    // 上一次執行時間
14    PRevtime.Time
15 
16    // The Job to run.
17    // 要執行的 Job
18    Job Job
19}

3)Job:每一個實體包含一個需要運行的Job

這是一個接口,只有一個方法:run

1type Job interface {
2    Run()
3}

由于 Entity 中需要 Job 類型,因此,我們希望定期運行的任務,就需要實現 Job 接口。同時,由于 Job 接口只有一個無參數無返回值的方法,為了使用方便,作者提供了一個類型:

1type FuncJob func()

它通過簡單的實現 Run() 方法來實現 Job 接口:

1func (f FuncJob) Run() { f() }

這樣,任何無參數無返回值的函數,通過強制類型轉換為 FuncJob,就可以當作 Job 來使用了,AddFunc 方法 就是這么做的。

4)Schedule:每個實體包含一個調度器(Schedule)

負責調度 Job 的執行。它也是一個接口。

1type Schedule interface {
2    // Return the next activation time, later than the given time.
3    // Next is invoked initially, and then each time the job is run.
4    // 返回同一 Entity 中的 Job 下一次執行的時間
5    Next(time.Time)time.Time
6}

Schedule 的具體實現通過解析 Cron 表達式得到。

庫中提供了 Schedule 的兩個具體實現,分別是 SpecSchedule 和 ConstantDelaySchedule。

① SpecSchedule

1type SpecSchedule struct{
2    Second, Minute, Hour, Dom, Month, Dow uint64
3}

從開始介紹的 Cron 表達式可以容易得知各個字段的意思,同時,對各種表達式的解析也會最終得到一個 SpecSchedule 的實例。庫中的 Parse 返回的其實就是 SpecSchedule 的實例(當然也就實現了 Schedule 接口)。

② ConstantDelaySchedule

1type ConstantDelaySchedule struct{
2    Delaytime.Duration// 循環的時間間隔
3}

這是一個簡單的循環調度器,如:每 5 分鐘。注意,最小單位是秒,不能比秒還小,比如 毫秒。

通過 Every 函數可以獲取該類型的實例,如:

1constDelaySchedule := Every(5e9)

得到的是一個每 5 秒執行一次的調度器。

4、主要實例化方法

1) 函數

① 實例化 Cron

1func New() *Cron {
2    return&Cron{
3        entries:  nil,
4        add:      make(chan *Entry),
5        stop:     make(chan struct{}),
6        snapshot: make(chan []*Entry),
7        running: false,
8    }
9}

可見實例化時,成員使用的基本是默認值;

② 解析 Cron 表達式

1func Parse(spec string) (_ Schedule, err error)

spec 可以是:

Full crontab specs, e.g. “* * * * * ?”Descriptors, e.g. “@midnight”, “@every 1h30m”

② 成員方法

1// 將 job 加入 Cron 中
2// 如上所述,該方法只是簡單的通過 FuncJob 類型強制轉換 cmd,然后調用 AddJob 方法
3func (c *Cron) AddFunc(spec string, cmd func()) error
4 
5// 將 job 加入 Cron 中
6// 通過 Parse 函數解析 cron 表達式 spec 的到調度器實例(Schedule),之后調用 c.Schedule 方法
7func (c *Cron) AddJob(spec string, cmd Job) error
8 
9// 獲取當前 Cron 總所有 Entities 的快照
10func (c *Cron) Entries() []*Entry
11 
12// 通過兩個參數實例化一個 Entity,然后加入當前 Cron 中
13// 注意:如果當前 Cron 未運行,則直接將該 entity 加入 Cron 中;
14// 否則,通過 add 這個成員 channel 將 entity 加入正在運行的 Cron 中
15func (c *Cron) Schedule(schedule Schedule, cmd Job)
16 
17// 新啟動一個 goroutine 運行當前 Cron
18func (c *Cron) Start()
19 
20// 通過給 stop 成員發送一個 struct{}{} 來停止當前 Cron,同時將 running 置為 false
21// 從這里知道,stop 只是通知 Cron 停止,因此往 channel 發一個值即可,而不關心值是多少
22// 所以,成員 stop 定義為空 struct
23func (c *Cron) Stop()

5、使用示例

查看源代碼打印幫助
1package main
2 
3import (
4    "github.com/robfig/cron"
5    "log"
6)
7 
8func main() {
9    i := 0
10    c := cron.New()
11    spec := "*/5 * * * * ?"
12    c.AddFunc(spec, func() {
13        i++
14        log.Println("cron running:", i)
15    })
16    c.Start()
17 
18    select{}
19}

這是一個簡單示例。

輸出類似這樣:

2014/02/22 21:23:40 cron running: 12014/02/22 21:23:45 cron running: 22014/02/22 21:23:50 cron running: 32014/02/22 21:23:55 cron running: 42014/02/22 21:24:00 cron running: 5

可見 cron 的使用還是挺簡單的。

6、Go 版 cron 源碼地址

源碼地址


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美高清不卡在线| 欧美色道久久88综合亚洲精品| 亚洲人成伊人成综合网久久久| 国产精品精品视频一区二区三区| 欧美视频在线看| 国产精品美女免费看| 亚洲伦理中文字幕| 欧美日韩激情视频| 欧美日韩爱爱视频| 97精品欧美一区二区三区| 亚洲18私人小影院| 一区二区国产精品视频| 亚洲人精选亚洲人成在线| 国产精品福利无圣光在线一区| 国内精品一区二区三区四区| 成人有码在线播放| 欧美极品在线视频| 日韩激情av在线播放| 欧美日韩一区二区在线| 亚洲美女www午夜| 亚洲成人久久一区| 国产精品扒开腿爽爽爽视频| 高清一区二区三区四区五区| 欧美孕妇性xx| 亚洲香蕉成人av网站在线观看| 久久中文字幕国产| 成人a视频在线观看| 欧美激情二区三区| 日韩精品中文字幕在线播放| 97成人精品视频在线观看| 色系列之999| 中文字幕在线看视频国产欧美| 午夜剧场成人观在线视频免费观看| 在线观看国产欧美| 日韩有码在线观看| 按摩亚洲人久久| 国产欧美精品xxxx另类| 亚洲自拍偷拍在线| 亚洲美腿欧美激情另类| 日本高清+成人网在线观看| 欧美多人爱爱视频网站| 成人免费自拍视频| 亚洲精品国产综合区久久久久久久| 一区二区三区亚洲| 欧美精品性视频| 亚洲三级黄色在线观看| 日韩免费观看高清| 日韩美女激情视频| 欧美一级淫片videoshd| 国产精品视频永久免费播放| 国产日韩欧美日韩| 国产精品91久久| 久久在线免费观看视频| 色偷偷亚洲男人天堂| 亚洲丁香婷深爱综合| 亚洲一区二区三区视频| 日韩免费在线观看视频| 欧美国产视频一区二区| 日韩黄色在线免费观看| 亚洲精品网站在线播放gif| 久久久中文字幕| 久久91亚洲精品中文字幕| 精品性高朝久久久久久久| 懂色av影视一区二区三区| 国产欧美日韩亚洲精品| 久久91精品国产91久久跳| 国产精品久久久久久久久久三级| 亚洲福利视频专区| 高清欧美性猛交xxxx黑人猛交| 日韩在线视频免费观看高清中文| 91久久在线视频| 成年无码av片在线| 日韩精品在线观| 在线播放日韩精品| 精品久久久久久国产| 韩剧1988免费观看全集| 久久精品2019中文字幕| 久久精品99无色码中文字幕| 日韩av片永久免费网站| 欧美日韩在线视频观看| 欧美日韩美女在线观看| 亚洲激情免费观看| 91影视免费在线观看| 亚洲人成网站色ww在线| 热久久这里只有精品| 亚洲福利精品在线| 日韩在线观看网站| 亚洲色图欧美制服丝袜另类第一页| 亚洲免费伊人电影在线观看av| 日韩亚洲第一页| 精品久久久91| 久久国产精品亚洲| 97久久精品在线| 欧美超级乱淫片喷水| 欧美极品欧美精品欧美视频| 成人免费观看49www在线观看| 高清欧美性猛交| 久久精品国产清自在天天线| 国产一区欧美二区三区| 日本视频久久久| 久久精品99国产精品酒店日本| 日韩中文字幕免费视频| 国产在线观看精品| 91欧美精品午夜性色福利在线| 91大神在线播放精品| 精品久久久久久国产| 欧美在线亚洲在线| 日韩在线视频观看| 日本一欧美一欧美一亚洲视频| 国产精品中文久久久久久久| 国产欧美日韩中文字幕在线| 精品无人区太爽高潮在线播放| 欧美日韩成人在线播放| 欧美日韩国产限制| 久久精品99久久久久久久久| 欧美激情第99页| 中文字幕亚洲欧美日韩2019| 欧美另类交人妖| 最近2019年好看中文字幕视频| 97久久精品国产| 国产剧情久久久久久| 91av成人在线| 亚洲一区亚洲二区| 精品国产精品三级精品av网址| 欧美黄色成人网| 亚洲欧美日韩直播| 97成人超碰免| 日韩在线观看免费全集电视剧网站| 91精品久久久久久久久久久久久久| 九九久久精品一区| 97在线观看视频国产| 中文字幕亚洲在线| 亚洲香蕉成视频在线观看| 91在线观看免费观看| 91色p视频在线| 成人夜晚看av| 亚洲人成网在线播放| www.欧美精品| 欧美日韩在线看| 北条麻妃在线一区二区| 久久免费少妇高潮久久精品99| 亚洲一区二区三区在线免费观看| 亚洲欧美国产va在线影院| 欧美日韩一区二区在线播放| 青青青国产精品一区二区| 97精品视频在线播放| 亚洲国产日韩一区| 美女扒开尿口让男人操亚洲视频网站| 国产91色在线播放| 亚洲精品一区久久久久久| 日韩在线一区二区三区免费视频| 亚洲精品之草原avav久久| 欧美日韩国产va另类| 亚洲一区二区三区四区视频| 久久精品国产一区二区三区| 欧美日韩精品在线视频| 97国产一区二区精品久久呦| 日本道色综合久久影院| 青青草原成人在线视频| 亚洲成人免费在线视频| 成人激情春色网| 亚洲国产精品中文| 久久久久久午夜| 国产伦精品一区二区三区精品视频|