【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(返回只读的时间通道)。
相关文章:
【Go底层】time包Ticker定时器原理
目录 1、背景2、go版本3、源码解释【1】Ticker结构【2】NewTicker函数解释 4、代码示例5、总结 1、背景 说到定时器我们一般想到的库是cron,但是对于一些简单的定时任务场景,标准库time包下提供的定时器就足够我们使用,本篇文章我们就来研究…...
mac下Gpt Chrome升级成GptBrowser书签和保存的密码恢复
cd /Users/自己的用户名/Library/Application\ Support/ 目录下有 GPT\ Chrome/ Google/ GptBrowser/ GPT\ Chrome 为原来的chrome浏览器的文件存储目录. GptBrowser 为升级后chrome浏览器存储目录 书签所在的文件 Bookmarks 登录账号Login 相关的文件 拷贝到GptBrow…...
[Redis#6] list | 命令 | 应用 | 消息队列 | 微博 Timeline
目录 List 列表 特点 2. 命令 头插和尾插 下标 range 查询 头删和尾删 LINSERT LLEN LREM LTRIM LSET 阻塞命令 BLPOP BRPOP 操作 总结 3. 内部编码 ziplist(压缩列表) linkedlist(链表) ✔️quicklist(快速链…...
服务器数据恢复—raid6阵列硬盘被误重组为raid5阵列的数据恢复案例
服务器存储数据恢复环境: 存储中有一组由12块硬盘组建的RAID6阵列,上层linux操作系统EXT3文件系统,该存储划分3个LUN。 服务器存储故障&分析: 存储中RAID6阵列不可用。为了抢救数据,运维人员使用原始RAID中的部分…...
Xcode15(iOS17.4)打包的项目在 iOS12 系统上启动崩溃
0x00 启动崩溃 崩溃日志,只有 2 行,看不出啥来。 0x01 默认配置 由于我开发时,使用的 Xcode 14.1,打包在另外一台电脑 Xcode 15.3 Xcode 14.1 Build Settings -> Asset Catalog Compliter - Options Xcode 15.3 Build S…...
Netty的心跳机制怎么实现的?
大家好,我是锋哥。今天分享关于【Netty的心跳机制怎么实现的?】面试题。希望对大家有帮助; Netty的心跳机制怎么实现的? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 Netty 的心跳机制用于维持客户端和服务器之间的…...
常用函数的使用错题汇总
目录 new/delete malloc/free1. 语言和类型2. 内存分配3. 内存释放4. 安全性和类型安全5. 其他特性总结 线程停止文件流 new/delete malloc/free malloc/free 和 new/delete 是 C/C 中用于动态内存管理的两种方式,它们有一些重要的区别。以下是这两种方式的比较&…...
使用 `aircrack-ng`扫描、获取握手包
使用 aircrack-ng 工具集来扫描 5GHz WiFi 网络的过程与扫描 2.4GHz 网络类似,但需要注意一些特定的配置和命令。以下是一个详细的步骤指南,帮助你在 5GHz 频段上扫描 WiFi 网络并捕获握手包。 ### 前提条件 1. **操作系统**:通常在 Linux 系…...
css—轮播图实现
一、背景 最近和朋友在一起讨论的时候,我们提出了这样的一个提问,难道轮播图的效果只能通过js来实现吗?经过我们的一系列的争论,发现了这是可以通过纯css来实现这一效果的,CSS轮播图也是一种常见的网页展示方式&#x…...
Ardusub源码剖析(1)——AP_Arming_Sub
代码 AP_Arming_Sub.h #pragma once#include <AP_Arming/AP_Arming.h>class AP_Arming_Sub : public AP_Arming { public:AP_Arming_Sub() : AP_Arming() { }/* Do not allow copies */CLASS_NO_COPY(AP_Arming_Sub);bool rc_calibration_checks(bool display_failure)…...
ESP32-S3模组上跑通ES8388(10)
接前一篇文章:ESP32-S3模组上跑通ES8388(9) 二、利用ESP-ADF操作ES8388 2. 详细解析 上一回解析了es8388_init函数中的第3段代码(也是实际与ES8388寄存器打交道的第1段代码),本回继续往下解析。为了便于理…...
AI/ML 基础知识与常用术语全解析
目录 一.引言 二.AI/ML 基础知识 1.人工智能(Artificial Intelligence,AI) (1).定义 (2).发展历程 (3).应用领域 2.机器学习(Machine Learning,ML) (1).定义 (2).学习方式 ①.监督学习 ②.无监督…...
【C#设计模式(15)——命令模式(Command Pattern)】
前言 命令模式的关键通过将请求封装成一个对象,使命令的发送者和接收者解耦。这种方式能更方便地添加新的命令,如执行命令的排队、延迟、撤销和重做等操作。 代码 #region 基础的命令模式 //命令(抽象类) public abstract class …...
Could not resolve com.android.tools.build:gradle:7.4.2.
Android Studio编译项目报错如下,始终无法下载解析7.4.2的gradle classpath A problem occurred configuring root project aistudyclient_questionlib. > Could not resolve all files for configuration :classpath.> Could not resolve com.android.tools…...
uniapp在App端定义全局弹窗,当打开关闭弹窗会触发onShow、onHide生命周期怎么解决?
在uniapp(App端)中实现自定义弹框,可以通过创建一个透明页面来实现。点击进入当前页面时,页面背景会变透明,用户可以根据自己的需求进行自定义,最终效果类似于弹框。 遇到问题:当打开弹窗(进入弹窗页面)就会触发当前页…...
2024 ccpc 辽宁省赛 E(构造 思维?)L(二分+一点点数论知识?)
E 题意: 可以注意到: 我的两种方格都四个方格的大小。 所以 如果存在一种摆放方式 那么 4|nm。 再考虑一种特殊的情况 22 ,此时虽然我的积是4 但是无法摆放的。 1>对于 4 | n,或者 4 | m.我直接摆放第二种方格就可以了。 如果我n 是4 的…...
IIC 随机写+多次写 可以控制写几次
verilog module icc_tx#(parameter SIZE 2 , //用来控制写多少次 比如地址是0000 一个地址只能存放8bit数据 超出指针就会到下一个地址0001parameter CLK_DIV 50_000_000 ,parameter SPEED 100_000 ,parameter LED 50 )( input wire c…...
基于SpringBoot+Vue的汽车票网上预订系统-无偿分享 (附源码+LW+调试)
目录 1. 项目技术 2. 功能菜单 3. 部分功能截图 4. 研究背景 5. 研究目的 6. 可行性分析 6.1 技术可行性 6.2 经济可行性 6.3 操作可行性 7. 系统设计 7.1 概述 7.2 系统流程和逻辑 7.3 系统结构 8. 数据库设计 8.1 数据库ER图 (1)公告信…...
net9 abp vnext 多语言通过数据库动态管理
通过数据库加载实现动态管理,用户可以自己修改界面显示的文本,满足国际化需求 如图所示,前端使用tdesign vnext 新建表TSYS_Localization与TSYS_LocalizationDetail 国旗图标下载网址flag-icons: Free Country Flags in SVG 在Shared下创建下图3个文件 …...
pip安装github上的开源软件包
1、若本机中安装的有git,可使用githttps方式安装 # 以安装pyfolio软件包为例,安装指令如下 pip install githttps://github.com/quantopian/pyfolio.git 2、若本机中没有安装git,可以直接使用软件包的zip地址进行安装 # 以安装pyfolio软件包为例,安装…...
【LeetCode刷题之路】120:三角形最小路径和的两种解法(动态规划优化)
LeetCode刷题记录 🌐 我的博客主页:iiiiiankor🎯 如果你觉得我的内容对你有帮助,不妨点个赞👍、留个评论✍,或者收藏⭐,让我们一起进步!📝 专栏系列:LeetCode…...
架构04-透明多级分流系统
零、文章目录 架构04-透明多级分流系统 1、透明多级分流系统 (1)概述 **定义:**透明多级分流系统是指在用户请求从客户端发出到最终查询或修改数据库信息的过程中,通过多个技术部件对流量进行合理分配,以提高系统的…...
云原生后端开发:构建现代化可扩展的服务
随着微服务架构的普及和容器化技术的成熟,云原生后端开发成为了构建现代化、可扩展系统的关键。本文将从云原生理念出发,结合实际案例,探讨如何使用 Kubernetes、服务网格、微服务架构等技术构建高效的云原生后端。 一、云原生的核心理念 1.…...
在Windows和Linux系统上获取网卡MAC地址及相关信息所有常用方法整理
摘要 在网络管理和故障排除中,了解如何获取网卡的MAC地址、IP地址以及网卡名称是系统管理员必备的技能。本文将介绍在Windows和Linux系统上手动获取网卡MAC地址的方法,并提供脚本以自动化获取服务器中网卡信息的过程。这些技巧和工具将帮助新手系统管理…...
制作苹果IOS.APP所使用步骤和方法-有步骤视情况待完善
1.获取开发工具 首先,您需要下载并安装Xcode。Xcode是苹果开发iOS和macOS应用程序的官方集成开发环境(IDE)。它包含了必要的工具,例如代码编辑器、调试器、编译器和界面构建器。Xcode可在Mac App Store中免费下载。 2.学习Swift或…...
【conda】全面解析 Conda 配置文件:从完整示例到最佳实践
目录 引言一、Conda 配置文件示例1.1 中英文注释示例1.2 文件编码格式 二、详细解释2.1 ssl_verify: true2.2 channels2.3 envs_dirs2.4 pkgs_dirs2.5 custom_channels2.6 remote_read_timeout_secs 和 remote_connect_timeout_secs2.7 show_channel_urls2.8 default_packages2…...
ffmpeg命令详解
原文网址:ffmpeg命令详解_IT利刃出鞘的博客-CSDN博客 简介 本文介绍ffmpeg命令的用法。 命令示例 1.mp4和avi的基本互转 ffmpeg -i D:\input.mp4 E:\output.avi ffmpeg -i D:\input.avi E:\output.mp4 -i 表示input,即输入。后面填一个输入地址和一…...
asyncio.run() 里面嵌套 asyncio.run() 可以吗?
[TOC](asyncio.run() 里面嵌套 asyncio.run() 可以吗?) 在 Python 的异步编程中,asyncio 是一个非常重要的模块,它提供了编写单线程并发代码的基础设施。asyncio.run() 是一个方便的函数,用于运行一个协程并管理事件循环的生命周…...
flutter in_app_purchase google支付 PG-GEMF-01错误
问题:PG-GEMF-01错误 flutter 使用in_app_purchase插件升降级订阅时报错PG-GEMF-01。 解决方案: 升降级订阅时,确保不调用 MethodCallHandlerImpl.java文件中的 setObfuscatedAccountId()方法、setObfuscatedProfileId()方法 原因…...
Flink 离线计算
文章目录 一、样例一:读 csv 文件生成 csv 文件二、样例二:读 starrocks 写 starrocks三、样例三:DataSet、Table Sql 处理后写入 StarRocks四、遇到的坑 <dependency><groupId>org.apache.flink</groupId><artifactId&…...
排序算法之插入排序篇
插入排序 思路: 就是将没有排序的元素逐步地插入到已经排好序的元素后面,保持元素的有序 视频的实现过程如下: 插入排序全过程 代码实现过程如下: public static void Insertion(int[] arr) { for (int i 1; i < arr.length…...
(11)(2.2) BLHeli32 and BLHeli_S ESCs(二)
文章目录 前言 1 传递支持 前言 BLHeli 固件和配置应用程序的开发是为了允许配置 ESC 并提供额外功能。带有此固件的 ESC 允许配置定时、电机方向、LED、电机驱动频率等。在尝试使用 BLHeli 之前,请按照 DShot 设置说明进行操作(DShot setup instructions)。 1 传…...
Unity之一键创建自定义Package包
内容将会持续更新,有错误的地方欢迎指正,谢谢! Unity之一键创建自定义Package包 TechX 坚持将创新的科技带给世界! 拥有更好的学习体验 —— 不断努力,不断进步,不断探索 TechX —— 心探索、心进取! …...
【AI】JetsonNano启动时报错:soctherm OC ALARM
1、问题描述 将JetsonNano烧写SD卡镜像为Ubuntu20.04后,启动时报错:soctherm OC ALARM,启动失败;然后系统一直重启 2、原因分析 “soctherm OC ALARM”是检测到系统温度超过安全阈值时发出的过热警告。 “soctherm”代表系统…...
道路机器人识别交通灯,马路,左右转,黄线,人行道,机器人等路面导航标志识别-使用YOLO标记
数据集分割 train组66% 268图片 validation集22% 91图片 test集12% 48图片 预处理 没有采用任何预处理步骤。 增强 未应用任何增强。 数据集图片: 交通灯 马路 右转 向右掉头 机器人识别 人行横道 黄线 直行或右转 数据集下载: 道路…...
电子应用设计方案-31:智能AI音响系统方案设计
智能 AI 音响系统方案设计 一、引言 智能 AI 音响作为一种新兴的智能家居设备,通过融合语音识别、自然语言处理、音频播放等技术,为用户提供便捷的语音交互服务和高品质的音乐体验。本方案旨在设计一款功能强大、性能稳定、用户体验良好的智能 AI 音响系…...
SQL优化与性能——数据库设计优化
数据库设计优化是提高数据库性能、确保数据一致性和支持业务增长的关键环节。无论是大型企业应用还是小型项目,合理的数据库设计都能够显著提升系统性能、减少冗余数据、优化查询响应时间,并降低维护成本。本章将深入探讨数据库设计中的几个关键技术要点…...
脑网络组织与心跳动力学之间的耦合测量
摘要 近年来,人们对脑心相互作用的研究兴趣日益浓厚。许多研究提出了新的方法来探究大脑与心脏如何通信,从而对一些神经功能有了新的认识。然而,大多数框架只关注单个脑区域与心跳动态之间的相互作用,忽略了大脑的功能网络会随着…...
图像显示的是矩阵的行和列,修改为坐标范围。
x 3; y 3; f1x x^2 y^2; guance1 f1x; F (x, y) sqrt((x.^2 y.^2 - guance1).^2); % 使用点乘 [x, y] meshgrid(0:1:5, 0:1:5); Z F(x, y); figure; imagesc(Z); % 由于 imagesc 使用矩阵索引作为坐标,我们需要手动添加刻度 % 这里我们假设 x 和 y 的范围…...
一体化数据安全平台uDSP 入选【年度创新安全产品 TOP10】榜单
近日,由 FreeBuf 主办的 FCIS 2024 网络安全创新大会在上海隆重举行。大会现场揭晓了第十届 WitAwards 中国网络安全行业年度评选获奖名单,该评选自 2015 年举办以来一直饱受赞誉,备受关注,评选旨在以最专业的角度和最公正的态度&…...
[免费]SpringBoot+Vue景区订票(购票)系统【论文+源码+SQL脚本】
大家好,我是java1234_小锋老师,看到一个不错的SpringBootVue大景区订票(购票)系统,分享下哈。 项目视频演示 【免费】SpringBootVue景区订票(购票)系统 Java毕业设计_哔哩哔哩_bilibili 项目介绍 现代经济快节奏发展以及不断完善升级的信息…...
力扣215:数组中第K大的元素
给定整数数组 nums 和整数 k,请返回数组中第 k 个最大的元素。 请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。 你必须设计并实现时间复杂度为 O(n) 的算法解决此问题。 示例 1: 输入: [3,2,1,5,6,4],k 2 …...
永久停用PostgreSQL 归档功能
文章目录 引言永久停用归档功能归档的优势归档的劣势开启归档的情况关闭归档的情况see also引言 PostgreSQL 是一个开源的关系型数据库系统,支持数据归档(WAL),可以实现数据备份、恢复和灾难恢复等功能。在使用 PostgreSQL 的过程中,如果 PostgreSQL 数据库开启了归档(a…...
23种设计模式-原型(Prototype)设计模式
文章目录 一.什么是原型设计模式?二.原型模式的特点三.原型模式的结构四.原型模式的优缺点五.原型模式的 C 实现六.原型模式的 Java 实现七. 代码解析八.总结 类图: 原型设计模式类图 一.什么是原型设计模式? 原型模式(Prototype…...
【Linux】-学习笔记06
第二章、时间同步服务器 2.1时间同步服务器的使用 2.1.1系统时区时间的管理 timedatectl set-time "2024-02-13 10:41:55" ##设定系统时间 timedatectl list-timezones ##显示系统的所有时区 timedatectl set-timezone "Asia/Shangh…...
李永平:以科技创新为引擎,驱动中国国际未来产业研究院不断前行
作者:李望 在科技创新与产业升级的滚滚洪流中,唯有洞察未来者,方能引领时代浪潮。近日,中国国际未来产业研究院迎来了重量级嘉宾——李永平院士。他的加盟,为研究院注入了全新的活力。作为业界的领军人物,李永平院士将担任研究院常务副院长、资深专家及高级法律顾问,共同规划未…...
netconf 代码架构
NETCONF(Network Configuration Protocol)是一种基于 XML 的网络配置管理协议,主要用于在网络设备之间进行配置管理、状态监控和操作。它被设计为一种可扩展的协议,并且在自动化网络管理中扮演着重要角色。NETCONF 通过安全的通信…...
【查询目录】.NET开源 ORM 框架 SqlSugar 系列
.NET开源 ORM 框架 SqlSugar 系列 【开篇】.NET开源 ORM 框架 SqlSugar 系列【入门必看】.NET开源 ORM 框架 SqlSugar 系列【实体配置】.NET开源 ORM 框架 SqlSugar 系列【Db First】.NET开源 ORM 框架 SqlSugar 系列【Code First】.NET开源 ORM 框架 SqlSugar 系列【数据事务…...
广域网技术
企业需要通过广域网将这些分散在不同地理位置的分支机构连接起来 早期广域网技术概述 广域网:连接不同地区局域网的网络,能够横跨几个洲提供远距离通信,形成国际性的远程网络 广域网设备角色介绍: CE:用户端连接服务…...
基于Java Springboot 求职招聘平台
一、作品包含 源码数据库设计文档万字PPT全套环境和工具资源部署教程 二、项目技术 前端技术:Html、Css、Js、Vue2、Element-ui 数据库:MySQL 后端技术:Java、Spring Boot、MyBatis 三、运行环境 开发工具:IDEA 数据库&…...