Golang定時任務簡單實現


下載cron包:

go get github.com/robfig/cron

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

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表達式:

表達式如果算上年份,共7位:

秒 分 時 日 月 周 年

實際應用中很少用到年份,所以一般表達式都是6位:

秒 分 時 日 月 周

*/1 * * * * ? 每秒

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位長度來指定表達式的。

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

公眾號:李田路口


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM