Golang定時任務簡單實現

下載cron包:git

go get github.com/robfig/cron

開啓一個定時:
根據cron表達式進行時間調度,cron能夠精確到秒,大部分表達式格式也是從秒開始。
c := cron.New()默認從分開始,因此加上cron.WithSeconds(),保證定時按照表達式字面意思執行。github

func main() {
  c := cron.New(cron.WithSeconds()) //精確到秒
  
  //定時任務
  spec := "*/1 * * * * ?" //cron表達式,每秒一次
  c.AddFunc(spec, func() {
     fmt.Println("11111")
  })
  
  c.Start()
  select {}  //阻塞主線程中止
}

中止定時:
因爲goroutine沒有線程id,因此沒法從外部中止指定的定時任務。cron自帶Stop()方法,支持在方法體裏使用,來中止當前定時。
什麼時候調用Stop()方法,須要根據自身業務觸發,例如運行完成100次後中止,數據庫當前狀態爲註銷時中止,等等。數據庫

func main() {
  c := cron.New(cron.WithSeconds()) //精確到秒
  
  //定時任務
  spec := "*/1 * * * * ?" //cron表達式,每秒一次
  c.AddFunc(spec, func() {
    status := getStatus() //獲取定時任務的狀態
    if status == true {
      fmt.Println("11111")
    } else { 
      c.Stop() //當前定時任務狀態已註銷
    }
  })
  
  c.Start()
  select {}  //阻塞主線程中止
}

開啓多個定時:
一個c對象能夠加載多個定時任務,此時在其中一個方法裏調用Stop()方法,全部定時任務都會中止。測試

func main() {
  c := cron.New(cron.WithSeconds()) //精確到秒
  
  //定時任務
  spec := "*/1 * * * * ?" //cron表達式,每秒一次
  c.AddFunc(spec, func() {
     fmt.Println("11111")
  })
  
  spec1 := "*/5 * * * * ?" //cron表達式,每5秒一次
  c.AddFunc(spec1, func() {
     fmt.Println("22222")
  })
  
  c.Start()
  select {}  //阻塞主線程中止
}

常見cron表達式:spa

表達式若是算上年份,共7位:線程

秒 分 時 日 月 周 年code

實際應用中不多用到年份,因此通常表達式都是6位:對象

秒 分 時 日 月 周token

*/1 * * * * ? 每秒get

00 * * * * ? 每分

00 30 22 * * ? 天天晚上22:30

00 30 22 * * 2 每週二晚上22:30

00 30 22 * * 1,3 每週一和週三晚上22:30

*/5 35 10 * * 1-3 每週一到週三上午10點35分00秒開始第一次,而後每5秒一次

00 10,40 14 ? 3 4 每一年三月的星期四的下午14:10和14:40

須要更復雜更細緻的表達式寫法,可自行上網查找。

注意:

網上有不少不一樣的cron包,同一個包版本也有多個,總體用法雖類似,但對cron表達式的處理會有必定差異,例如c := cron.New()有直接從秒開始的,不用加cron.WithSeconds(),也有用5位長度來指定表達式的。

因此,具體使用哪一個包,最好下載更新最新版本,表達式的語法也要經過實際測試進行驗證,保證任務按照咱們指定的時間執行。

公衆號:李田路口

相關文章
相關標籤/搜索