golang 第三方定时任务库 github.com/robfig/cron/v3 核心源码解读
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了golang 第三方定时任务库 github.com/robfig/cron/v3 核心源码解读,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3515字,纯文字阅读大概需要6分钟。
内容图文
定时任务是一个通用场景的功能,在golang中,现在github最为常见的一个第三方定时任务库就是 github.com/robfig/cron/v3 目前(2020年1月9日) 7.2k Star。
我之前使用Python的时候用惯了apscheduler
,切换这个是真的不习惯。
感觉github.com/robfig/cron/v3
功能太简陋了,
- 不支持定时任务持久化,我重启一下服务,调度任务信息就没了,需要自己存储调度信息。
- 再比如不支持一次定时见issue等,虽然有PR 但是 v3 分支还是依旧不支持,parse文件函数不支持,虽然可以按照作者的说发,调用一次之后再调用移除可以实现。
- 不支持立即运行,见issue ,作者表示可以调用后手动调用解决,但是我感觉不够优雅,没有指定首次运行时间方便。(我突然有种想提PR的冲动,哈哈哈)
综上,个人感觉这个库封装的不是很完善,作为一个golang新手,读解析一下这个定时任务库,还是很有收获的。如果能力允许,以解决以上问题为目标,自己提PR。
注意
文章内容皆为个人见解,并且只看了核心的实现方式,细节部分没有解析,不保证准确,如果和你的理解有歧义,以你的为准。
前置知识
你需要掌握golang的 goroutine
知识,包括channel
通信,select
多路复用等知识,否则解读起来就会很困难。
简单的demo
更多使用demo可以参考 个人Go学习笔记
package _1_demo
import (
"fmt"
"github.com/robfig/cron/v3"
"testing"
"time"
)
// 定时任务
func jobTask() {
fmt.Printf( "任务启动: %s \n",time.Now().Format("2006-01-02 15:04:05"))
}
func TestCron(t *testing.T) {
// 创建一个cron对象
c := cron.New()
// 任务调度
enterId, err := c.AddFunc("@every 3s", jobTask)
if err!=nil{
panic(err)
}
fmt.Printf("任务id是 %d \n", enterId)
// 启动定时任务
c.Start()
// 用于阻塞 后面可以使用 select {} 阻塞
time.Sleep(time.Second * 9)
}
源码解读
核心文件主要就是cron.go
文件
首先可以看到 c := cron.New()
创建了这个 Cron结构体对象
type Cron struct {
entries []*Entry // 用于存放job指针对象的数组
chain Chain
stop chan struct{} // 定制调度任务
add chan *Entry // 添加一个调度任务
remove chan EntryID // 移除 一个调度任务
snapshot chan chan []Entry // 正在运行中的调度任务
running bool // 保证整个Cron对象只启动一次 和启动后其他chan正常
logger Logger // 记录日志
runningMu sync.Mutex // 协程锁,确保执行安全
location *time.Location // 时区
parser ScheduleParser // 解析参数
nextID EntryID // 下一个调度任务的id
jobWaiter sync.WaitGroup // 确保单一的调度任务执行完毕
}
再看看 Entry
包含那些
// Entry consists of a schedule and the func to execute on that schedule.
type Entry struct {
// ID is the cron-assigned ID of this entry, which may be used to look up a
// snapshot or remove it.
ID EntryID // 任务调度Id,默认是自增 创建任务时返回
// Schedule on which this job should be run.
Schedule Schedule // 调度任务运行
// Next time the job will run, or the zero time if Cron has not been
// started or this entry's schedule is unsatisfiable
Next time.Time // 下次执行时间
// Prev is the last time this job was run, or the zero time if never.
Prev time.Time // 上次执行时间
// WrappedJob is the thing to run when the Schedule is activated.
WrappedJob Job // 执行的任务
// Job is the thing that was submitted to cron.
// It is kept around so that user code that needs to get at the job later,
// e.g. via Entries() can do so.
Job Job
}
调度任务enterId, err := c.AddFunc("@every 3s", jobTask)
会使用以下两个文件来解析定时执行的参数,也就是翻译给golang 解析@erery 3s
是干什么
- https://github.com/robfig/cron/blob/v3/parser.go 解析自定义的定时参数 比如@erery等
- https://github.com/robfig/cron/blob/v3/spec.go 解析 crontab 表达式
内容总结
以上是互联网集市为您收集整理的golang 第三方定时任务库 github.com/robfig/cron/v3 核心源码解读全部内容,希望文章能够帮你解决golang 第三方定时任务库 github.com/robfig/cron/v3 核心源码解读所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。