首页 > 其他分享 >Go--cron定时任务

Go--cron定时任务

时间:2023-11-02 15:58:15浏览次数:35  
标签:-- fmt cron Println func Go 定时 main

Cron是Go中用于设置定时任务的一个库,需要注意的是,Cron库分两个大版本,v1.2和v3.0,其功能和go get地址都是不同的,注意区分。

v1.2官方文档:https://pkg.go.dev/github.com/robfig/cron

v3官方文档:https://pkg.go.dev/github.com/robfig/cron/v3

区别:

  • v1.2版本默认支持精确到秒的cron表达式
  • v3版本默认不再是支持秒级别定时任务,而是从分钟域开始执行,要细化到秒级别时,必须携带cron.WithSeconds()参数
  • v3支持定时任务的撤销功能

 

下载:

go get -u github.com/robfig/cron
go get -u github.com/robfig/cron/v3

 

用法介绍:

用法与linux的crontab类似,不过多了个秒级别

* * * * * *    //依次是 秒 分 时 日 月 周

特殊字符:

  • ?  只能在day跟week中使用,标识未说明的值,用以解决day跟week的冲突,比如 * * * 10 * ? 表示每月10号触发,而换成 * 则表示不管星期几都可触发,与前者发生冲突
  • L 表示last,只能在day跟week中使用,每月最后一天或者每周最后一天(星期六)触发
  • W 只能在day中使用,表示最接近指定天的工作日(周一至周五),例:5W,每月第5天的工作日触发,若当天是星期六,则提前,若是星期天,则往后触发;不跨月份

 

预定义模式(用于AddFunc()):

模式 描述 等价于
@yearly (or @annually) 每年一次,一月一日午夜 0 0 0 1 1 *
@monthly 每月运行一次,每月第一天午夜 0 0 0 1 * *
@weekly 每周运行一次,周六/周日午夜 0 0 0 * * 0
@daily (or @midnight) 每天运行一次,当天午夜 0 0 0 * * *
@hourly 每小时的开始运行一次 0 0 * * * *
@every 每个持续的时间 例:c.AddFunc("@every 1s",func() {})

 

设置时区:

默认情况下,所有时间都是基于当前时区的,也可自定义

  • 在时间字符串前面添加一个CRON_TZ= + 具体时区
    • 东京时区:Asia/Tokyo
    • 纽约时区:America/New_York
    • 上海时区:Asia/Shanghai
    • 香港时区:Asia/Hong_Kong
  • 创建cron对象时增加一个时区选项cron.WithLocation(location),location为time.LoadLocation(zone)加载的时区对象,zone为具体的时区格式。或者调用已创建好的cron对象的SetLocation()方法设置时区
复制代码
func main() {
//直接配置时区
nyc, _ := time.LoadLocation("America/New_York")
c := cron.New(cron.WithLocation(nyc))        //cron.New(cron.WithLocation(time.UTC))
c.AddFunc("0 6 * * ?", func() {
fmt.Println("Every 6 o'clock at New York")
})

//参数里面配置时区
c.AddFunc("CRON_TZ=Asia/Tokyo 0 6 * * ?", func() {
fmt.Println("Every 6 o'clock at Tokyo")
})
复制代码

 

示例:

v1.2

复制代码
package main

import (
    "fmt"
    "github.com/robfig/cron"
)

func cronv1() {
    fmt.Println("starting...")

    //创建一个定时任务对象
    c := cron.New()
    //给对象增加定时任务
    c.AddFunc("*/5 * * * * *", func() {
        fmt.Println("hello world 1")
    })
    c.AddFunc("*/8 * * * * *", func() {
        fmt.Println("hello world 2")
    })

    //启动定时任务
    c.Start()

}

func main() {
    cronv1()

    //查询语句,阻塞,让main函数不退出,保持程序运行
    select {}
}
复制代码

 

v3:秒级

复制代码
package main

import (
    "fmt"
    "github.com/robfig/cron/v3"
)

func cronv3() {
    fmt.Println("starting...")

    //创建一个定时任务对象
    c := cron.New(cron.WithSeconds())
    //给对象增加定时任务
    c.AddFunc("*/5 * * * * *", func() {
        fmt.Println("hello world 1")
    })
    c.AddFunc("*/8 * * * * *", func() {
        fmt.Println("hello world 2")
    })

    //启动定时任务
    c.Start()

}

func main() {
    cronv3()

    //查询语句,阻塞,让main函数不退出,保持程序运行
    select {}
}
复制代码

 

v3:分钟级

复制代码
package main

import (
    "fmt"
    "github.com/robfig/cron/v3"
)

func main() {
    //创建一个定时任务对象
    c := cron.New()
    //给对象增加定时任务
    c.AddFunc("1 * * * *", func() {
        fmt.Println("1")
    })

    //启动定时任务
    c.Start()
    //查询语句,阻塞,让main函数不退出,保持程序运行
    select {}

}
复制代码

 

标签:--,fmt,cron,Println,func,Go,定时,main
From: https://www.cnblogs.com/siyunianhua/p/17805581.html

相关文章

  • [RC-03] 记忆
    prologue今天模拟赛T3,一道很好的题目。analysis对于这个题目我们可以通过对操作的手玩,得出一个结论。记\(ans\)为当前所有的合法子串数量,记\(tmp\)为当前以最后以一个括号结尾的子串个数。可以推出来前两个操作分别的转移式子:\[ans\getsans+tmp+1,p\getsp+1......
  • The Parade
    本文思路来自伟大的@FxorGhere二分的单调性:如果\(mid\)可以,那么小于\(mid\)的也一定可以(从每排末尾剔除一些人即可)。主要问题是贪心的选法。原问题所引出的可能得选人的方案可能是离散的,比如:225当每排人数是2时,一下方案是一种最优解:1个身高为1的,1个身高为2的1个身高为1......
  • 【视频】风险价值VaR原理与Python蒙特卡罗Monte Carlo模拟计算投资组合实例|附代码数
    原文链接:http://tecdat.cn/?p=22862 最近我们被客户要求撰写关于风险价值的研究报告,包括一些图形和统计输出。风险价值(VaR)是一种统计数据,用于量化公司、投资组合在特定时间范围内可能发生的财务损失程度什么是风险价值(VaR)?该指标最常被投资银行和商业银行用来确定其机构......
  • 购物车 复选框和反选 全部选择案例
    <!DOCTYPEhtml><html><head><metacharset="utf-8"><title>购物车复选框的选中反选的案例</title></head><body>All<inputclass="all"name="Checkbox"......
  • 【专题】2023年中国仿生机器人产业全景报告PDF合集分享(附原数据表)
    原文链接:https://tecdat.cn/?p=34144原文出处:拓端数据部落公众号仿生机器人作为一类结合了仿生学原理的机器人,具备自主决策和规划行动的能力,正逐渐进入大众视野。它们的核心技术要素包括感知与认知技术、运动与控制技术、人机交互技术和自主决策技术。阅读原文,获取专题报告合集......
  • 合集
    E.Lomsatgelral注意答案会爆int点击查看代码#include<bits/stdc++.h>usingnamespacestd;constintN=1e5+10;#defineLLlonglongLLw[N];//wintn,q;vector<int>g[N];vector<int>qr[N];LLans[N];map<int,int>cnt[N];//第一维深度,第二维点权,第三维记录是否存......
  • StoneDB-8.0-V2.1.0 企业版正式发布!免费公测活动正在进行中,快来参加!
    很高兴告诉大家,我们StoneDB-8.0-V2.1.0企业版正式发布了!经过一个月的开发,我们的研发团队用极高的效率对2.0新架构版本查漏补缺,完善了最新架构的代码,并对性能、稳定性做出了优化,同时也修复了一些用户们反馈的bug,新增了一些更友好的基础特性。目前StoneDB-8.0-V2.1.0企业版正......
  • C#中无法将文件“obj\x86\Debug\BookShoopTuto.exe”复制到“bin\Debug\BookShoo
    因为任务多开了,数据无法写入也是因为这个去任务管理区删掉运行的项目就可以了(删掉BookShoopTuto) 参考博客——https://blog.csdn.net/nxg0916/article/details/126782186......
  • [十二省联考 2019] 春节十二响
    [十二省联考2019]春节十二响感觉作为例题还是挺不错的。感官上直接分析比较困难。不妨先考虑怎样的段长集合是合法的。注意到合法等价于对每一条从根到叶子的链都合法,考虑在链上贪心,尝试将每个和比他大的最小的点做匹配,如果能匹配上就是合法。很显然,如果仅考虑一条链,那么极小......
  • Python中判断为false
    列表和元祖、字典为空、数字0、布尔False、空字符串==》if判断为Falsex=()ifx:print(x)print('不为空')else:print(x)print('空')#输出:()空注意:x={}这里的类型为空字典x={1,2,3,4}这里的类型为set集合列表和元祖、字......