【Go底层】time包Ticker定时器原理

目录

  • 1、背景
  • 2、go版本
  • 3、源码解释
    • 【1】Ticker结构
    • 【2】NewTicker函数解释
  • 4、代码示例
  • 5、总结

1、背景

说到定时器我们一般想到的库是cron,但是对于一些简单的定时任务场景,标准库time包下提供的定时器就足够我们使用,本篇文章我们就来研究一下time包下的Ticker定时器。

2、go版本

$ go version
go version go1.21.4 windows/386

3、源码解释

【1】Ticker结构

Ticker结构如下:

type Ticker struct {C <-chan Time  //元素类型为Time的只读通道r runtimeTimer //底层定时结构
}

runtimeTimer结构如下:

type runtimeTimer struct {pp       uintptrwhen     int64  //定时器触发时间period   int64  //定时器触发间隔f        func(any, uintptr) //定时器触发要执行的函数arg      any   //定时器触发执行函数的参数seq      uintptrnextwhen int64 //定时器下次触发时间status   uint32
}

【2】NewTicker函数解释

NewTicker函数用于初始化Ticker对象,源码如下:

func NewTicker(d Duration) *Ticker {if d <= 0 {panic("non-positive interval for NewTicker")}c := make(chan Time, 1) //初始化一个存放时间类型,缓冲区大小为1的通道t := &Ticker{C: c,   //时间通道r: runtimeTimer{  //底层定时对象when:   when(d),  //下一次任务执行时间period: int64(d), //每次任务执行间隔f:      sendTime, //时间到之后要执行的函数arg:    c,  //要执行的函数的参数},}startTimer(&t.r) //开启定时任务,更底层逻辑,不用关心其实现return t
}

初始化之后我们一般使用Ticker对象的方式为间隔d时间从Ticker对象里的C通道读取到当前时间,一般我们认为到时间之后就会往C通道写入当前时间,每次间隔时间都能读到数据,其实每次间隔不一定能读到,这个就看sendTime函数的实现了,源码如下:

func sendTime(c any, seq uintptr) {select {case c.(chan Time) <- Now():default:}
}

select中有一个default块,前面看过c通道的缓冲区大小为1,如果上一次缓冲区里记录的时间未被读取,那么这次写c通道就会阻塞,select没有找到合适的case时就会走default分支,所以这次时间并不会记录到通道缓冲区中就已经开始准备下一个到时间点执行逻辑。后面会给一个简单的例子来演示这种场景。

4、代码示例

接下来给一个示例来演示从Ticker的通道中读取时间不一定是固定间隔的,示例如下:

func main() {logger.Info("测试Ticker开始")t := time.NewTicker(5 * time.Second) //创建一个定时器,每隔5秒执行一次time.Sleep(17 * time.Second) //延时5+5+5+2秒logger.Info("第1次读取通道", zap.Time("读取到的时间", <-t.C))logger.Info("第2次读取通道", zap.Time("读取到的时间", <-t.C))
}

上面示例初始化了一个每5秒执行一次的定时对象,我们延时5的整数倍再加小于5的时间之后,从定时对象的通道中读取两次时间并打印出来观察,打印输出如下:

[2024-11-29 17:31:12.902] | INFO  | Goroutine:1  | [chan_demo/main.go:74]       | 测试Ticker开始
[2024-11-29 17:31:29.981] | INFO  | Goroutine:1  | [chan_demo/main.go:80]       | 第1次读取通道 | {"读取到的时间": "[2024-11-29 17:31:17.986]"}
[2024-11-29 17:31:32.978] | INFO  | Goroutine:1  | [chan_demo/main.go:81]       | 第2次读取通道 | {"读取到的时间": "[2024-11-29 17:31:32.978]"}

开始定时任务时间为12秒,第1次读取通道和第2次读取通道时间分别为17和32秒,并不是间隔5秒的,也就验证了22、27秒走的sendTime函数中的default分支。

5、总结

通过对Ticker对象中通道的理解,在select中有多个case时,对于准备好的case,select会从中随机选择一个,所以要注意case中如有Ticker的通道对象时,不一定会定时间隔的读取到数据。Ticker对象还提供了一些其它的函数:Stop(停止定时器)、Reset(重置定时器)、Tick(返回只读的时间通道)。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Xilinx PCIe高速接口入门实战(一)

引言&#xff1a;本文对Xilinx 7 Series Intergrated Block for PCI Express PCIe硬核IP进行简要介绍&#xff0c;主要包括7系列FPGA PCIe硬核资源支持、三IP硬核差异、PCIe硬核资源利用等相关内容。 1. 概述 1.1 7系列FPGA PCIe硬件资源支持 7系列FPGA对PCIe接口最大支持如…

【第三讲】Spring Boot 3.4.0 新特性详解:增强的配置属性支持

Spring Boot 3.4.0 版本在配置属性的支持上进行了显著增强&#xff0c;使得开发者能够更灵活地管理和使用应用程序的配置。新的特性包括对配置属性的改进、类型安全增强、以及对环境变量的更好支持。这些改进旨在提升开发效率和代码可读性&#xff0c;同时简化配置过程。本文将…

如何使用 Chrome 无痕浏览模式访问网站?

无痕浏览&#xff08;Incognito Mode&#xff09;是 Google Chrome 浏览器提供的一种隐私保护功能&#xff0c;它允许用户在一个独立的会话中浏览网页&#xff0c;而不会记录用户的浏览历史、下载历史、表单数据等。这对于希望保护个人隐私或进行临时性匿名浏览的用户来说非常有…

拥抱 OpenTelemetry:阿里云 Java Agent 演进实践

作者&#xff1a;陈承 背景 在 2018 年的 2 月&#xff0c;ARMS Java Agent 的第一个版本正式发布&#xff0c;为用户提供无侵入的的可观测数据采集服务。6 年后的今天&#xff0c;随着软件技术的迅猛发展、业务场景的逐渐丰富、用户规模的快速增长&#xff0c;我们逐渐发现过…

AI数据分析工具(二)

豆包-免费 优点 强大的数据处理能力&#xff1a; 豆包能够与Excel无缝集成&#xff0c;支持多种数据类型的导入&#xff0c;包括文本、数字、日期等&#xff0c;使得数据整理和分析变得更加便捷。豆包提供了丰富的数据处理功能&#xff0c;如数据去重、填充缺失值、转换格式等…

C/C++ 数据结构与算法 【时间复杂度和空间复杂度】【日常学习,考研必备】

一、时间复杂度 定义&#xff1a;时间复杂度描述了算法运行时间随输入大小增长而增长的趋势。它主要关注的是算法中最耗时的部分&#xff0c;并忽略常数因子、低阶项等细节。表示方法&#xff1a;通常使用大O符号&#xff08;Big O notation&#xff09;来表示时间复杂度。例如…

linux 文件权限,修改权限,c库调用

参考chmod 777 到底是啥 ???看完这个你就完全懂了&#xff01;-CSDN博客 ls -l 查看当前目录文件的权限 会有一个十位的东西 分别为 d:这是一个文件夹 后面3*3位分别表示所有者用户&#xff0c;同组用户&#xff0c;其他用户的读(r)&#xff0c;写(w)&#xff0c;执行(x)…

mysql 事务之LBCC与MVCC

一、事务 数据库事务&#xff08;Database Transaction&#xff09;是数据库管理系统&#xff08;DBMS&#xff09;中执行的一系列操作&#xff0c;这些操作被当作一个逻辑单元进行处理&#xff0c;以保证数据的一致性和完整性。 ACID&#xff0c;事务四个关键特性 1、原子性…

Wireshark 4.4.2:安全更新、错误修复、更新协议支持

流行的网络协议分析器Wireshark已更新至4.4.2版本。它可用于网络故障排除、分析、开发和教育。 已修复以下漏洞&#xff1a; wnpa-sec-2024-14 FiveCo RAP 解剖器无限循环。wnpa-sec-2024-15 ECMP 解析器崩溃。 更新的协议支持&#xff1a; ARTNET、ASN.1 PER、BACapp、B…

Vue-01

Vue框架 Vue官网&#xff1a; Vue.js 框架 数据模型和view的通信就是依靠viewmodel的关键。 目前主流版本仍然是vue2版本。 Vue快速入门 1.新建一个HTML文件&#xff0c;引入Vue.js文件。Vue.js文件是官方引入的一个文件&#xff0c;我们如果要使用Vue就必须引入这个文件。…

HarmonyOS 5.0应用开发——列表(List)

【高心星出品】 文章目录 列表&#xff08;List&#xff09;列表介绍列表布局设置主轴方向设置交叉轴方向 列表填充分组列表填充 滚动条位置设置滚动位置滚到监听 列表项侧滑 列表&#xff08;List&#xff09; 列表介绍 列表作为一种容器&#xff0c;会自动按其滚动方向排列…

004 MATLAB数值微积分

01 函数的极值点 求解一元函数在区间(x1,x2)中极小值点&#xff1a; xfminbnd(fun,x1,x2)求解初始向量为x0的多元函数极小值点x和对应的极值y [x,y]fminsearch(fun,x0)02 微积分 1.数值微分&#xff1a; 一次微分&#xff1a; diff(x) 若x是一个向量&#xff0c;则返回[x(…

Milvus×Florence:一文读懂如何构建多任务视觉模型

近两年来多任务学习&#xff08;Multi-task learning&#xff09;正取代传统的单任务学习&#xff08;single-task learning&#xff09;&#xff0c;逐渐成为人工智能领域的主流研究方向。其原因在于&#xff0c;多任务学习可以让我们以最少的人力投入&#xff0c;获得尽可能多…

开展网络安全成熟度评估:业务分析师的工具和技术

想象一下,您坐在飞机驾驶舱内。起飞前,您需要确保所有系统(从发动机到导航工具)均正常运行。现在,将您的业务视为飞机,将网络安全视为飞行前必须检查的系统。就像飞行员依赖检查表一样,业务分析师使用网络安全成熟度评估来评估组织对网络威胁的准备程度。这些评估可帮助…

MATLAB 中有关figure图表绘制函数设计(论文中常用)

在撰写论文时&#xff0c;使用 MATLAB 导出的图像常常因大小和格式不统一&#xff0c;导致投稿时编辑部频繁退稿&#xff0c;要求修改和调整。这不仅浪费时间&#xff0c;也增加了工作量。为了减少这些麻烦&#xff0c;可以在 MATLAB 中导出图像时提前设置好图表的大小、格式和…

Nuxt.js 应用中的 render:response 事件钩子

title: Nuxt.js 应用中的 render:response 事件钩子 date: 2024/11/29 updated: 2024/11/29 author: cmdragon excerpt: render:response 是一个在 Nuxt.js 中与服务器端渲染(SSR)相关的钩子,它会在请求的响应发送之前被调用。这个钩子的目的是让开发者可以在响应发送之…

AI实践项目——图片视频自动上色系统,让旧照片焕然一新

1.主要内容 &#xff08;1&#xff09;项目概述 在图片处理的世界中&#xff0c;AI不仅用于识别和分析&#xff0c;还可以赋予灰度照片色彩&#xff0c;为其注入新的生命。今天&#xff0c;我们将探讨一种通过深度学习模型为灰度图片上色的技术。 ①参考文献 Colorful Image…

Vue教程|搭建vue项目|Vue-CLI新版脚手架

一、安装Node环境 安装Node及Npm环境 Node下载地址:Node.js — Run JavaScript EverywhereNode.js is a JavaScript runtime built on Chromes V8 JavaScript engine.https://nodejs.org/en/ 安装完成后,检查安装是否成功,并检查版本,命令如下: node -v npm -v mac@Macd…

从 App Search 到 Elasticsearch — 挖掘搜索的未来

作者&#xff1a;来自 Elastic Nick Chow App Search 将在 9.0 版本中停用&#xff0c;但 Elasticsearch 拥有你构建强大的 AI 搜索体验所需的一切。以下是你需要了解的内容。 生成式人工智能的最新进展正在改变用户行为&#xff0c;激励开发人员创造更具活力、更直观、更引人入…

ERROR in [eslint] Invalid Options ‘extensions‘ has been removed.

看着这个报错 感觉是版本不对引起的 ERROR in [eslint] Invalid Options: - Unknown options: extensions - extensions has been removed. ERROR in Error: Child compilation failed: [eslint] Invalid Options: - Unknown options: extensions - extensions has b…