首页>>后端>>Golang->Golang定时任务cron最新版

Golang定时任务cron最新版

时间:2023-11-29 本站 点击:0

一、cron定时任务简述

cron用表达式来指定执行任务的时间,异步执行。表达式说明如下:

#文件格式說明#┌──分鐘(0-59)#│┌──小時(0-23)#││┌──日(1-31)#│││┌─月(1-12)#││││┌─星期(0-6,表示从周日到周六)#│││││#*****被執行的命令

可以在https://crontab.guru/#0_4_8-14_*_*查看上图,检查你的表达式是否正确

二、golang 操作cron发布定时任务

1. 安装cron最新第三方库,和老版本的最大区别在于如果需要秒级定义,需要额外传入参数,并且可以自由配置参数

gogetgithub.com/robfig/cron/v3

2. 示例:

packagemainimport("fmt""github.com/robfig/cron/v3""time")funcTestCron(){c:=cron.New()i:=1EntryID,err:=c.AddFunc("*/1****",func(){fmt.Println(time.Now(),"每分钟执行一次",i)i++})fmt.Println(time.Now(),EntryID,err)c.Start()time.Sleep(time.Minute*5)}funcmain(){TestCron()}

得到结果->

2021-09-0610:26:32.7499139+0800CSTm=+0.0030000011<nil>2021-09-0610:27:00.0009139+0800CSTm=+27.254000001每分钟执行一次12021-09-0610:28:00.0009139+0800CSTm=+87.254000001每分钟执行一次22021-09-0610:29:00.0009139+0800CSTm=+147.254000001每分钟执行一次32021-09-0610:30:00.0009139+0800CSTm=+207.254000001每分钟执行一次42021-09-0610:31:00.0009139+0800CSTm=+267.254000001每分钟执行一次5

3. 相对旧版的改动(常用部分,详细可参考 Go 每日一库之 cron)

3.1. 秒级操作

cron.WithSeconds()

3.2. 函数没执行完就跳过本次函数

cron.WithChain(cron.SkipIfStillRunning(cron.DefaultLogger))

3.3. 打印任务日志

cron.WithLogger(cron.VerbosePrintfLogger(log.New(os.Stdout,"cron:",log.LstdFlags)))

3.4. 综合上述示例:

packagemainimport("fmt""github.com/robfig/cron/v3""log""os""time")funcTestCron(){c:=cron.New(cron.WithSeconds(),cron.WithChain(cron.SkipIfStillRunning(cron.DefaultLogger)),cron.WithLogger(cron.VerbosePrintfLogger(log.New(os.Stdout,"cron:",log.LstdFlags))))i:=1EntryID,err:=c.AddFunc("*/5*****",func(){fmt.Println(time.Now(),"每5s一次----------------",i)time.Sleep(time.Second*6)i++})fmt.Println(time.Now(),EntryID,err)c.Start()time.Sleep(time.Second*30)}funcmain(){TestCron()}
得到结果, 第二次定时到的时候,函数还在time.sleep中,便跳过了->
2021-09-0610:55:44.5709139+0800CSTm=+0.0030000011<nil>cron:2021/09/0610:55:44startcron:2021/09/0610:55:44schedule,now=2021-09-06T10:55:44+08:00,entry=1,next=2021-09-06T10:55:45+08:00cron:2021/09/0610:55:45wake,now=2021-09-06T10:55:45+08:00cron:2021/09/0610:55:45run,now=2021-09-06T10:55:45+08:00,entry=1,next=2021-09-06T10:55:50+08:002021-09-0610:55:45.0009139+0800CSTm=+0.433000001每5s一次----------------1cron:2021/09/0610:55:50wake,now=2021-09-06T10:55:50+08:00cron:2021/09/0610:55:50run,now=2021-09-06T10:55:50+08:00,entry=1,next=2021-09-06T10:55:55+08:00cron:2021/09/0610:55:55wake,now=2021-09-06T10:55:55+08:00cron:2021/09/0610:55:55run,now=2021-09-06T10:55:55+08:00,entry=1,next=2021-09-06T10:56:00+08:002021-09-0610:55:55.0009139+0800CSTm=+10.433000001每5s一次----------------2cron:2021/09/0610:56:00wake,now=2021-09-06T10:56:00+08:00cron:2021/09/0610:56:00run,now=2021-09-06T10:56:00+08:00,entry=1,next=2021-09-06T10:56:05+08:00cron:2021/09/0610:56:05wake,now=2021-09-06T10:56:05+08:00cron:2021/09/0610:56:05run,now=2021-09-06T10:56:05+08:00,entry=1,next=2021-09-06T10:56:10+08:002021-09-0610:56:05.0009139+0800CSTm=+20.433000001每5s一次----------------3cron:2021/09/0610:56:10wake,now=2021-09-06T10:56:10+08:00cron:2021/09/0610:56:10run,now=2021-09-06T10:56:10+08:00,entry=1,next=2021-09-06T10:56:15+08:00

3.5. 启动多个任务AddJob:

packagemainimport("fmt""github.com/robfig/cron/v3""time")typeJob1struct{}func(tJob1)Run(){fmt.Println(time.Now(),"I'mJob1")}typeJob2struct{}func(tJob2)Run(){fmt.Println(time.Now(),"I'mJob2")}funcTestCron(){c:=cron.New(cron.WithSeconds())EntryID,err:=c.AddJob("*/5*****",Job1{})fmt.Println(time.Now(),EntryID,err)EntryID,err=c.AddJob("*/10*****",Job2{})fmt.Println(time.Now(),EntryID,err)c.Start()time.Sleep(time.Second*30)}funcmain(){TestCron()}
得到结果->
gogetgithub.com/robfig/cron/v30

作者:小小小丶叶子


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:/Golang/247.html