zoukankan      html  css  js  c++  java
  • 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位长度来指定表达式的。

    所以,具体使用哪个包,最好下载更新最新版本,表达式的语法也要通过实际测试进行验证,保证任务按照我们指定的时间执行。

    公众号:李田路口

  • 相关阅读:
    CodeBlocks 中fopen函数不支持命令 “r”
    【转载】分享一些Qt学习资源,欢迎下载
    【转载】知乎答案----孙志岗----Google 发布了程序员养成指南,国内互联网巨头是否也有类似的指南和课程推荐
    【转载】谷歌公司推荐的程序员必修课(英文教程)
    【转载】张逸--ThoughtWorks(中国)程序员读书雷达
    在windows环境下,为什么要用Notepad++编辑?
    【转载】池建强--趣谈个人建站
    JAVA入门第二季 第一章 类和对象
    CAP理论总结
    分布式通信方式之消息队列之RocketMQ
  • 原文地址:https://www.cnblogs.com/dubinyang/p/12327675.html
Copyright © 2011-2022 走看看