Cron常见用法

  • 每隔5分钟执行: /5 *
  • 第1-5分钟执行5次: 1-5
  • 每天10点, 22点整执行一次: 0 10,22 *

开源项目: https://github.com/gorhill/cronexpr

  • cronexpr 支持秒粒度 粒度年
  • parse, err := cronexpr.Parse(*/5 * * * * * *) // 每5秒

    1. func main() {
    2. // linux 分钟, 小时, 天, 月, 星期几
    3. // cronexpr 支持秒粒度 粒度年
    4. parse, err := cronexpr.Parse(`*/5 * * * * * *`)
    5. if err == nil {
    6. // 下次调度时间
    7. next := parse.Next(time.Now())
    8. time.AfterFunc(next.Sub(time.Now()), func() {
    9. fmt.Println("被调度了...")
    10. })
    11. }
    12. time.Sleep(5 * time.Second)
    13. }

调度多个任务

  1. type CronJob struct {
  2. expr *cronexpr.Expression
  3. nextTime time.Time
  4. }
  5. func main() {
  6. scheduleTable := make(map[string]*CronJob)
  7. // 执行过期的任务
  8. expr := cronexpr.MustParse(`*/5 * * * * * *`)
  9. cronJob := &CronJob{
  10. expr: expr,
  11. nextTime: expr.Next(time.Now()),
  12. }
  13. scheduleTable["job1"] = cronJob
  14. expr2 := cronexpr.MustParse(`*/5 * * * * * *`)
  15. cronJob2 := &CronJob{
  16. expr: expr2,
  17. nextTime: expr2.Next(time.Now()),
  18. }
  19. scheduleTable["job2"] = cronJob2
  20. go func() {
  21. for {
  22. now := time.Now()
  23. for jobName, cronJob := range scheduleTable {
  24. if cronJob.nextTime.Before(now) || cronJob.nextTime.Equal(now) {
  25. // 启动一个协程, 执行这个任务
  26. go func(jobName string) {
  27. fmt.Println("执行: ", jobName)
  28. }(jobName)
  29. // 计算下一次调度时间
  30. cronJob.nextTime = cronJob.expr.Next(now)
  31. fmt.Println("下次执行时间: ", cronJob.nextTime)
  32. }
  33. }
  34. select {
  35. case <-time.NewTimer(100 * time.Millisecond).C: // 100ms毫秒可读
  36. }
  37. }
  38. }()
  39. time.Sleep(100 * time.Second)
  40. }