go 的 timer reset
在 Go 语言 1.23 版本之前,与Timer(定时器)关联的通道是异步的(有缓冲,容量为 1)。这意味着即使在调用Timer.Stop(停止定时器)或Timer.Reset(重置定时器)并返回后,仍可能接收到过期的时间值。
换句话说,在 Go 1.23 之前,由于定时器的通道特性,可能会出现这样一种情况:即使已经尝试停止或重置定时器,但仍有可能从该定时器的通道中接收到已经过时的时间触发信号,因为这个通道的异步和缓冲特性可能导致一些操作响应不及时或出现意外的信号接收。而在 Go 1.23 版本及之后,可能对定时器的这种行为进行了调整或改进,以避免出现接收过期时间值的情况。
// NewTimer creates a new Timer that will send
// the current time on its channel after at least duration d.
//
// Before Go 1.23, the garbage collector did not recover
// timers that had not yet expired or been stopped, so code often
// immediately deferred t.Stop after calling NewTimer, to make
// the timer recoverable when it was no longer needed.
// As of Go 1.23, the garbage collector can recover unreferenced
// timers, even if they haven't expired or been stopped.
// The Stop method is no longer necessary to help the garbage collector.
// (Code may of course still want to call Stop to stop the timer for other reasons.)
//
// Before Go 1.23, the channel associated with a Timer was
// asynchronous (buffered, capacity 1), which meant that
// stale time values could be received even after [Timer.Stop]
// or [Timer.Reset] returned.
// As of Go 1.23, the channel is synchronous (unbuffered, capacity 0),
// eliminating the possibility of those stale values.
//
// The GODEBUG setting asynctimerchan=1 restores both pre-Go 1.23
// behaviors: when set, unexpired timers won't be garbage collected, and
// channels will have buffered capacity. This setting may be removed
// in Go 1.27 or later.
go 1.23之前 timer.Reset和go 1.23之后 timer.Reset 区别
在 Go 1.23 之前,与计时器相关联的通道是异步的(缓冲,容量为 1),这意味着即使在 Timer.Stop 或 Timer.Reset 返回后,也能接收到过期的时间值。对于使用 NewTimer 创建的计时器,只有在通道(channel)耗尽的定时器停止或过期时才会调用重置。例如,在 Go1.22 及以前的版本上,结合程序来看,计时器 t 的超时时间为 50 毫秒。在 Sleep 方法等待 100 毫秒后,计时器 t 早已经过期,向 t.C 通道发送了一个值。但由于 Reset 方法并不会耗尽通道,因此 <-t.C 不会阻塞,并立即继续程序。
而在 Go 1.23 中,该通道是同步通道(无缓冲,容量为 0),从而消除了出现过期时间值的可能性。Go 1.23 对 time.Timer 和 time.Ticker 的实现进行了重大更改。在 Go 1.23 中,任何调用 Reset 或 Stop 方法的操作,在该调用之前准备的任何过时值都不会在调用后被发送或接收。新的行为仅在主 Go 程序位于使用 Go 1.23.0 或更高版本的 go.mod 文件的模块中时才会启用。当 Go 1.23 构建旧程序时,旧行为仍然有效。新的 GODEBUG 设置 asynctimerchan=1 可以在即使程序在其 go.mod 文件中指定了 Go 1.23.0 或更高版本时,也恢复到异步通道行为。此外,Go 1.23 版本正式发布后,Russ Cox 解决了一直困扰 Go 团队的 Timer/Ticker 的 GC 回收问题,进而解决了 Timer 的 Stop 和 Reset 很难正确使用的问题。
Go1.23 之前 timer.reset 行为
在 Go1.23 之前,对于使用 NewTimer 创建的计时器,只有在通道(channel)耗尽的定时器停止或过期时才会调用重置。例如,在一些特定的场景下,若计时器未处于特定状态就调用 Reset 方法,可能会导致不可预期的结果。这种行为在实际应用中可能会给开发者带来一些困扰,因为开发者需要时刻关注计时器的状态,以确保在正确的时机调用 Reset 方法。这不仅增加了开发的复杂性,还可能导致一些难以排查的错误。比如在一些需要频繁重置计时器的场景中,开发者可能需要额外编写复杂的逻辑来判断计时器的状态,以避免出现错误的重置操作。
Go1.23 之后 timer.reset 行为
在 Go1.23 中,Reset 方法的行为得到了改进。Reset 使计时器重新开始计时,(本方法返回后再)等待时间段 d 过去后到期。如果调用时计时器还在等待中会返回真;如果计时器已经到期或者被停止了会返回假。这一改进使得计时器的使用更加直观和方便。开发者不再需要像在 Go1.23 之前那样时刻关注计时器的状态来判断是否可以进行重置操作。现在,只需要简单地调用 Reset 方法,就可以让计时器重新开始计时。这大大简化了开发过程,减少了出错的可能性。同时,这一改进也提高了代码的可读性和可维护性,使得开发者能够更加专注于业务逻辑的实现,而不是花费大量时间在处理计时器的复杂状态上。
Go1.23 对 timer.reset 的改进使得 Go 语言在计时器的使用上更加便捷和可靠。这一改进体现了 Go 语言不断发展和完善的趋势,为开发者提供了更好的开发体验。
示例
func TestDemo(d *testing.T) {t := time.NewTimer(time.Millisecond * 40)// t已经触发,t.C已经有值time.Sleep(time.Millisecond * 100)start := time.Now()// 对于使用 NewTimer 创建的计时器,只有在 channel 耗尽的定时器停止或过期时才会调用重置// 这里定时器没有被耗尽// Reset 方法并不会耗尽通道,因此 <-t.C 不会阻塞,并立即继续程序ok := t.Reset(time.Millisecond * 40)// 1.23之前是false,false表示已过期/停止// 1.23 中,任何调用 Reset 或 Stop 方法的操作,在该调用之前准备的任何过时值都不会在调用后被发送或接收fmt.Println("ok:", ok)// 等待过期// 1.23之前,立马过期,等待0ms,应为过期的未读取的信号未被清空// 1.23及之后,Reset 会清空过期的未读取的信号,然后等待40ms过期<-t.Cfmt.Printf("wait:%dms\n", time.Since(start).Milliseconds())
}// 在Go1.23中,创建timer之后,Reset会重置timer,可以放心的当成一个新的timer来使用。
// Reset只要没被触发都会返回true,
相关文章:
go 的 timer reset
在 Go 语言 1.23 版本之前,与Timer(定时器)关联的通道是异步的(有缓冲,容量为 1)。这意味着即使在调用Timer.Stop(停止定时器)或Timer.Reset(重置定时器)并返…...
每日一面 day03
Q:介绍一下MySQL的三种日志(redo,undo,bin) Redo Log 和 Undo Log 是存储引擎 InnoDB 层面实现的,Bin Log 是 MySQL 层面实现的。 下面是三种日志的简要介绍: Redo Log:保证事务的…...
ssm基于SSM框架的餐馆点餐系统的设计+VUE
系统包含:源码论文 所用技术:SpringBootVueSSMMybatisMysql 免费提供给大家参考或者学习,获取源码请私聊我 需要定制请私聊 目 录 摘要 I Abstract II 1绪论 1 1.1研究背景与意义 1 1.1.1研究背景 1 1.1.2研究意义 1 1.2国内外研究…...
多人播报配音怎么弄?简单4招分享
想象一下,你手中的小说突然间活了起来,每个角色都有了自己的声音和情感。 这就是多人配音的魅力所在。它让文字跃然纸上,赋予了故事新的生命。 那么,如何制作一部引人入胜的小说呢?多人配音怎么制作的呢?…...
《Windows PE》4.1导入表
导入表顾名思义,就是记录外部导入函数信息的表。这些信息包括外部导入函数的序号、名称、地址和所属的DLL动态链接库的名称。Windows程序中使用的所有API接口函数都是从系统DLL中调用的。当然也可能是自定义的DLL动态链接库。对于调用方,我们称之为导入函…...
计算机专业大学生应该如何规划大学四年?
计算机专业的大学生在学习过程中应该注重以下几个方面,以确保他们在快速变化的技术领域中保持竞争力: 基础知识: 数学基础:离散数学、线性代数、概率论等数学课程对于理解算法和数据结构至关重要。编程基础:学习至少一…...
R知识图谱1—tidyverse玩转数据处理120题
以下是本人依据张老师提供的tidyverse题库自行刷题后的tidyverse Rmd文件,部分解法参考张老师提示,部分解法我本人灵感提供 数据下载来源https://github.com/zhjx19/tidyverse120/tree/main/data 参考https://github.com/MaybeBio/R_cheatsheet/tree/mai…...
【赵渝强老师】K8s中的有状态控制器StatefulSet
在K8s中,StatefulSets将Pod部署成有状态的应用程序。通过使用StatefulSets控制器,可以为Pod提供持久存储和持久的唯一性标识符。StatefulSets控制器与Deployment控制器不同的是,StatefulSets控制器为管理的Pod维护了一个有粘性的标识符。无论…...
机器学习笔记(持续更新)
使用matplotlib绘图: import matplotlib.pyplot as plt fig, axplt.subplots() #创建一个图形窗口 plt.show() #不绘制任何内容,直接显示空图 重复值处理: 重复值处理代码: import pandas as pd data pd.DataFrame({学号: [1…...
Nginx 配置之server块
在 Nginx 配置中使用两个 server 块是为了处理 HTTP 和 HTTPS 请求的不同需求。具体来说: 第一个 server 块: 监听 80 端口(HTTP)。将所有 HTTP 请求重定向到 HTTPS(443 端口)。 第二个 server 块ÿ…...
魅族Lucky 08惊艳亮相:极窄四等边设计引领美学新风尚
在这个智能手机设计趋于同质化的时代,魅族以其独特的设计理念和创新技术,再次为市场带来了一股清新之风。 近日,魅族全新力作——Lucky 08手机正式曝光,其独特的“极窄物理四等边”设计瞬间吸引了众多消费者的目光,而…...
自动化的抖音
文件命名 main.js var uiModule require("ui_module.js"); if (!auto.service) {toast("请开启无障碍服务");auto.waitFor();} var isRunning true; var swipeCount 0; var targetSwipeCount random(1, 10); var window uiModule.createUI(); uiMo…...
无人机之巡航控制篇
一、巡航控制的基本原理 无人机巡航控制的基本原理是通过传感器检测无人机的飞行状态和环境信息,并将其反馈给控制器。控制器根据反馈信息和任务需求,计算出无人机的控制指令,并将其发送给执行机构。执行机构根据控制器的控制指令,…...
面试必问的7大测试分类!一文说清楚!
在日常测试工作中,我们经常会听到“单元测试,集成测试,系统测试”之类的词汇,大家都知道这是按照开发阶段进行测试活动的划分。 这种划分完整的分类,其实是分为四种“单元测试,集成测试,系统测…...
深信服上网行为管理AC无法注销在线用户
下图用户认证成功后无法注销 很多入网的用户都是使用的这个账号 针对单个IP强制注销也不生效 解决步骤: 接入管理-用户管理-用户绑定管理-用户绑定 删除绑定免认证的配置 删除后所有用户会强制注销掉,重新登录即可 可添加主页联系方式帮忙远程解决问…...
使用GitLab CI构建持续集成案例
1. 部署GitLab (1)基础准备 解压软件包并导入镜像: [rootmaster ~]# curl -O http://mirrors.douxuedu.com/competition/Gitlab-CI.tar.gz [rootmaster ~]# tar -zxvf Gitlab-CI.tar.gz [rootmaster ~]# ctr -n k8s.io image import gitla…...
WSL2环境下Ubuntu的Docker安装与配置
检查是否存在安装残留,移除可能会造成冲突的组件。 for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done从apt Docker仓库中安装官方GPG key: sudo apt-get update …...
使用vscode调试wails项目(golang桌面GUI)
文章目录 安装 Golang 环境安装 NPM安装 VSCode安装 Go 插件安装 Go 插件依赖工具安装 Wails系统检查 准备项目Visual Studio Code 配置安装和构建步骤参考资料 安装 Golang 环境 访问 golang 官网下载环境安装包:https://go.dev/dl/ 安装 NPM 从 Node 下载页面 …...
Java中注解与反射的详细介绍
注解和反射 一、注解 什么是注解?Annotation Override :表示一个方法声明打算重写超类的另一个方法声明Deprecated:表示不鼓励程序员使用这样的元素,(此注释可以用于修饰方法,属性,类…...
Redis 过期时间删除策略详解
在使用 Redis 时,设置键的过期时间是一项非常有用的功能。它可以帮助我们自动清理不再需要的数据,节省内存空间。那么,Redis 是如何处理这些带有过期时间的键呢?这就涉及到 Redis 的过期时间删除策略。 一、Redis 过期键的判定 R…...
镜头背后的AI魔法:Qwen-Edit多角度编辑技术的深度探索
镜头背后的AI魔法:Qwen-Edit多角度编辑技术的深度探索 【免费下载链接】Qwen-Edit-2509-Multiple-angles 项目地址: https://ai.gitcode.com/hf_mirrors/dx8152/Qwen-Edit-2509-Multiple-angles 问题溯源:当静态图像遇见动态视角需求 在博物馆的…...
Redis 单线程真的是单线程吗?源码角度全面解析
Redis 是单线程的——这句话流传太广了,以至于很多人真的以为 Redis 就一个线程在跑。但实际上,如果你 ps -ef 或者 top 看一眼正在运行的 Redis 进程,会发现线程数不止一个。 到底怎么回事?这篇文章从源码角度把这个问题彻底说清…...
用Python和Geogebra手把手复现阿克曼转向模型(附完整代码与可视化)
用Python和Geogebra手把手复现阿克曼转向模型(附完整代码与可视化) 在自动驾驶和机器人领域,理解车辆如何转向是基础中的基础。但当你第一次看到那些复杂的公式时,是不是感觉像在看天书?别担心,今天我们就用…...
GitHub开源项目日报 · 2026年3月30日 · 微软开源VibeVoice语音模型登顶,Claude Code生态项目持续火爆
本期榜单涵盖了语音AI、Claude Code辅助编程工具、换脸技术、金融数据平台、在线教育、数据可视化等多个领域的开源项目。超过10000星以上的项目有9个,其中freeCodeCamp以近44万星稳居榜首,Apache Superset、OpenBB、Deep-Live-Cam等项目也获得广泛关注。微软开源的VibeVoice…...
让AI成为开发伙伴:调用快马模型为养龙虾系统添加智能预测与问答功能
最近在开发一个养龙虾的智能决策系统,发现很多功能模块如果纯手写会非常耗时。尝试用AI辅助开发后,效率提升了不少,这里分享下具体实现思路和踩坑经验。 生长预测模块的实现 这个模块需要根据历史水温、投喂量等数据预测龙虾未来一周的生长情…...
51单片机开发环境搭建指南:从Keil5安装到程序烧录全流程
1. 51单片机开发环境搭建全攻略 刚接触51单片机的朋友可能会被一堆陌生的名词搞懵——Keil5、CH340、HEX文件、烧录工具...别担心,我当初也是这样过来的。今天我就用最直白的语言,手把手带你搭建完整的开发环境。整个过程就像组装乐高积木,只…...
TPCH dbgen数据生成工具在Linux环境下的配置与实战
1. 环境准备:从零搭建TPCH测试环境 第一次接触TPCH dbgen工具时,我花了整整两天时间才搞明白所有依赖关系。这个工具虽然功能强大,但官方文档确实不够友好。下面把我踩过的坑都总结出来,让你能快速上手。 系统要求方面,…...
FUTURE POLICE语音模型Agent智能体开发:多轮语音对话任务规划
FUTURE POLICE语音模型Agent智能体开发:多轮语音对话任务规划 想象一下,你对着手机说:“帮我订一张下周五从北京飞往上海,下午出发的机票,要经济舱。” 几秒钟后,手机用自然的人声回复你:“好的…...
human-pose-estimation.pytorch:简单而强大的人体姿态估计终极指南
human-pose-estimation.pytorch:简单而强大的人体姿态估计终极指南 【免费下载链接】human-pose-estimation.pytorch The project is an official implement of our ECCV2018 paper "Simple Baselines for Human Pose Estimation and Tracking(https://arxiv.o…...
用STM32F103C8和5路红外模块,我花了一个周末做了个能自己拐弯的小车(附完整代码)
从零打造智能循迹小车:STM32F103C8与红外模块的实战指南 看着桌上散落的电子元件逐渐组合成一个能自主行动的小车,这种成就感是任何现成玩具都无法比拟的。本文将带你完整经历一次基于STM32F103C8和五路红外模块的智能小车开发过程,无需复杂算…...
