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位长度来指定表达式的。

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

    公众号:李田路口

  • 相关阅读:
    爬取博客园有关爬虫的文章
    小只爬虫的相关思路
    fiddler显示出服务器IP方法
    在测试时用到的一些mysql的小技巧(持续更新)
    把python脚本打包成win可执行文件
    关于SQL中的ROWNUM问题
    关于C#的DataGridView设置了DataSource后Rows无值问题
    微信小程序wx.request的简单封装
    ASP.NET进行请求转发
    微信小程序设置滚动条
  • 原文地址:https://www.cnblogs.com/dubinyang/p/12327675.html
Copyright © 2011-2022 走看看