Go 语言项目源码解析:定时任务库 cron

news2024/11/23 11:19:54

环境准备

首先我们将源码克隆(Fork)为自己的个人仓库,只需要在 GitHub 项目主页点击 Fork 按钮,然后输入项目名称点击确认即可。克隆完毕后,可以下载到本地,或者直接在科隆后的 GitHub 仓库主页上点击 Create codespace on master 来创建 Codespace。Codespace 是 GitHub 推出的基于 Azure 云服务的远程编程功能,现在对个人账号开放了,可以试一下。

点击后,浏览器中会打开一个新页面,并会出现在线 VS Code 的界面,然后显示该项目的目录、代码以及终端,如下图。

由于我们本次的目的是解析源码,我们主要将在这上面展现和阅读代码,并不会执行它。

现在,我们可以开始解析源码了。

入口文件

解析源码的一个比较好的手段是找到入口文件(Entry File),相当于是一本书的引言(Introduction)章节,项目的整体结构通常会在入口文件中体现出来。

我们从项目介绍 README.md 文件中可以看到,这个定时任务库的使用方式是 cron.New(cron.WithSeconds()) 之类的,也就是 cron.New 方法。因此,我们可以猜测这个方法是在 cron.go 中,我们打开它看一看。

快速扫了一遍之后,我们可以发现这个 New 方法在 113 行,如下图。

仔细看一下,这个方法就是返回了一个 Cron 类的实例指针,中间的 opts ...Option 参数是一种函数式参数(Functional Option)。而实际的代码实现,无非就是构造了一个 Cron 类的实例指针 c,并对其应用了函数参数,然后返回它。

这样,我们可以判断,真正的定时任务核心逻辑就在 Cron 类中。

不过,无论如何,我们可以确定,入口文件就是 cron.go。接下来只需要分析这个文件包含的核心模块、逻辑就可以大概理清楚整个项目的源码了。

核心类

那么我们再来看一下核心类 Cron 的构造,看看是否有什么新东西。

在代码中搜索一下可以定位到 Cron 类在第 13 行。

Cron 类有很多属性,包括小写单词表示的私有属性 entrieschainparser 等等,我们暂时还不知道它们各自的含义,不过可以从名称猜测一下。另外,我们还可以看到第 10-12 行的注释描述,意思是 Cron 会追踪 entries,并执行被 schedule 定义的函数,它可以开始运行、结束运行,以及 entries 也会在运行过程中被检查。一脸懵逼?是的,这些描述虽然长,但并不能完全解释清楚,我们只有继续源码中的细节,才可以了解清楚。

另外,我们还可以在 Cron 类下面发现 3 个接口以及其描述:

  • ScheduleParser:定时任务的解析器,可以解析并返回 Schedule 实例;
  • Job:已提交的定时任务作业
  • Schedule:用于描述作业的运行周期。

其实,这 3 个接口都很重要,我们从它们的所在位置就可以判断出来。

入口方法

在继续探索之前,我们再回忆一下这个定时任务库的使用方法,除了 cron.New 之外,还需要调用 c.Start() 才能正式生效。因此,我们需要仔细看看 Cron 类的 Start 方法。这其实也是核心类的入口方法(Entry Method)。

我们可以在 cron.go 文件中定位到 Start 方法在第 215 行,如下图。

比较有经验的 Go 语言开发工程师应该会注意到,这是一个典型的原子性操作(Atomic Operation)。c.runningMu 是一个 sync.Mutex 实例,可以加锁(Lock);然后 defer c.runningMu.Unlock() 表示函数调用之后会解锁(Unlock),因此保证重复调用该方法的时候不会出现数据竞速(Data Race);if c.running { return } 的方法表示,如果已经开始运行了,就不会再执行,直接返回;c.running 设置运行状态为 true;最后一行比较关键,go c.run() 表示新起了一个协程(Goroutine)来运行 c.run 方法。因此,我们找到了更核心的方法,run。接下来的工作就是继续解析它了。

是不是很像玩 RPG 游戏时不断寻找机关,最终在千辛万苦之下可喜可贺进入下一关?

总结

等一下,就这么完结撒花了?我那啥都准备好了,你就让我看这个?

我们在这里暂时打住的主要原因是不想让这篇文章变得又臭又长。因为源码解析通常是一个需要耐心繁琐枯燥的过程,而这种过程有时会让读者产生抵触情绪。因此,笔者的主要目的是抛砖引玉,将源码解析的一些核心要领用手把手的方式告诉读者,而读者也会根据自己的理解去实际操作,这样学习起来会更快也会更有意思。

现在稍微总结一下这篇文章用到的解析源码技巧:

  1. 找到入口文件
  2. 定位核心类
  3. 解析入口方法

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

RabbitMQ

RabbitMQ 1.MQ引言 MessageQueue: 消息队列 模块之间的耦合度多高,导致一个模块宕机后,全部功能都不能用了,并且同步通讯的成本过高,用户体验差。 1.1什么是MQ MQ(Message Queue)消息队列,是基…

Android Studio App开发实战项目之广告轮播(附源码 可用于大作业)

需要图片集和源码请点赞关注收藏后评论区留言即可~~~ 电商App的首页上方,都在明显位置放了一栏广告条,并且广告条会轮播,非常吸引眼球,这种广告轮播的功能,为推广热门事物出力甚大。 轮播视频已上传至我的主页&#x…

【云原生】docker 搭建ElasticSearch7

前言 本篇演示如何基于docker环境快速搭建起es7的环境 安装es7.6 1、拉取镜像 docker pull elasticsearch:7.6.2 2、执行下面的命令进行安装 docker run -p 9200:9200 -p 9300:9300 -e "discovery.typesingle-node" -e ES_JAVA_OPTS"-Xms512m -Xmx512m"…

Android Studio App开发实战项目之计时器(附源码 简单易懂,适合新手学习)

运行有问题或需要源码请点赞关注收藏后评论区留言~~~ 一、Handler的延迟机制 活动页面的Java代码通常是串行工作的,而且App界面很快就加载完成容不得半点延迟,不过偶尔也需要某些控件时不时的动一下,好让界面呈现动画效果更加活泼&#xff0…

shiro框架04会话管理+缓存管理+Ehcache使用

目录 一、会话管理 1.基础组件 1.1 SessionManager 1.2 SessionListener 1.3 SessionDao 1.4 会话验证 1.5 案例 二、缓存管理 1、为什么要使用缓存 2、什么是ehcache 3、ehcache特点 4、ehcache入门 5、shiro与ehcache整合 1)导入相关依赖&#xff0…

2019银川F,ccpc威海D - Sternhalma 2022

1401D - Maximum Distributed Tree 求每个边经过的次数,假设求u,v这条边的次数,边的左端是u这个集合一共有n-siz[v]个点,右端是v这个集合有siz[v]个端点,经过这条边的次数就是siz[v]*(n-siz[v]),然后再按照次数多的乘以大的质因数…

【附源码】Python计算机毕业设计汽车租赁管理系统

项目运行 环境配置: Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术: django python Vue 等等组成,B/S模式 pychram管理等等。 环境需要 1.运行环境:最好是python3.7.7,…

Go 语言中的 Moduels 管理(Let‘s Go 三十四)

在 Go 1.11以前使用包管理一直被开发者所诟病。既然GOPATH这种包管理引起了一线开发者的一片骂声,所以,Go官方体恤一线开发者对GOPATH这种包管理的情绪,一直致力努力提供对一线开发者友好的包管理解决方法而奋斗。从最初的GOPATH到GO VENDOR&…

基于遗传算法、元胞自动机邻域和随机重启爬山混合优化算法(GA-RRHC)的柔性车间调度研究(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

LeetCode50天刷题计划第二季(Day 27 — 寻找旋转排序数组中的最小值(9.50- 11.20)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录前言一、题目寻找旋转排序数组中的最小值示例提示:二、思路三、代码前言 芜湖 一、题目 寻找旋转排序数组中的最小值 已知一个长度为 n 的数组&#…

web前端期末大作业——基于HTML+CSS+JavaScript实现中国茶文化(30页)

🎉精彩专栏推荐 💭文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 💂 作者主页: 【主页——🚀获取更多优质源码】 🎓 web前端期末大作业: 【📚毕设项目精品实战案例 (10…

大数据开发是做什么的?怎样入门?

其实现在有很多小伙伴看中了大数据的发展前景,但是其实不知道大数据开发具体是做什么的,又该怎么学习?学习了之后又该做什么? 下面具体给你分析下大数据开发是做什么的,又需要学习和掌握哪些技能~ 大数据开发做什么&a…

致远OA ajax.do 任意文件上传 (CNVD-2021-01627) 漏洞复现

为方便您的阅读,可点击下方蓝色字体,进行跳转↓↓↓01 漏洞描述02 影响范围03 验证方式04 利用方式05 修复方案01 漏洞描述 致远OA是一套办公协同管理软件。由于致远OA旧版本某些接口存在未授权访问,以及部分函数存在过滤不足,攻…

大数据实战之前戏

开发背景 因为要开发一套通话详单系统。该系统上每天产生1亿条通话话单,要保存一个月的通话话单。也就是保存30亿条通话,能够做到准实时的通话详单查询。于是采用大数据架构进行话单的保存和查询。 服务器规划 为了验证系统的可用性,我先搭…

从零学习 InfiniBand-network架构(七) ——IB协议中数据如何传输

从零学习 InfiniBand-network架构(七) —— IB协议中数据如何传输 🔈声明: 😃博主主页:王_嘻嘻的CSDN主页 🔑未经作者允许,禁止转载 🚩本专题部分内容源于《InfiniBand-n…

C++ 智能指针最佳实践源码分析

智能指针在 C11 标准中被引入真正标准库(C98 中引入的 auto_ptr 存在较多问题),但目前很多 C开发者仍习惯用原生指针,视智能指针为洪水猛兽。但很多实际场景下,智能指针却是解决问题的神器,尤其是一些涉及多…

QT之Windows开发及源码调试环境搭建

QT之Windows开发及源码调试环境搭建1. QT 安装2. 配置源码调试2.1 QTCreator2.2 Visual Studio 20193. 参考1. QT 安装 QT对5.15以及以上版本提供在线安装工具 官方链接清华镜像,但是这里面没由Windows的在线安装工具(2022/11/11查看的时候没有) 这里安装以QT 5.…

全是狠活!SpringBoot文档也太那个了,图文并茂详尽讲解

前沿 SpringBoot是由Pivotal团队提供的在Spring框架基础之上开发的框架,其设计目的是用来简化应用的初始搭建以及开发过程。 SpringBoot本身并不提供Spring框架的核心特性以及扩展功能,只是用于快速、敏捷地开发新一代基于Spring框架的应用程序。也就是…

【JavaSE】继承

文章目录1. 如何继承2. 子类如何访问父类的成员2.1 子类中访问父类的成员变量2.2 子类中访问父类的成员方法3. super关键字4. 如何写构造方法前言:为方便讲解一个java文件写多个类。 1. 如何继承 class Cat {public String name;public int age;public String sex;…

c++基础篇(一篇文章带你进入c++的新手村)

前沿: c作为目前比较的流行的语言之一,在就业上也是运用比较广泛的语言之一,并且经过这么多年的历练久经不衰,所以说选择学c是一个不错的选择^_^,前面看到一个段子,如何在21天精通c,我动态里有这…