当前位置: 首页 > news >正文

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 版本之前&#xff0c;与Timer&#xff08;定时器&#xff09;关联的通道是异步的&#xff08;有缓冲&#xff0c;容量为 1&#xff09;。这意味着即使在调用Timer.Stop&#xff08;停止定时器&#xff09;或Timer.Reset&#xff08;重置定时器&#xff09;并返…...

每日一面 day03

Q&#xff1a;介绍一下MySQL的三种日志&#xff08;redo&#xff0c;undo&#xff0c;bin&#xff09; Redo Log 和 Undo Log 是存储引擎 InnoDB 层面实现的&#xff0c;Bin Log 是 MySQL 层面实现的。 下面是三种日志的简要介绍&#xff1a; Redo Log&#xff1a;保证事务的…...

ssm基于SSM框架的餐馆点餐系统的设计+VUE

系统包含&#xff1a;源码论文 所用技术&#xff1a;SpringBootVueSSMMybatisMysql 免费提供给大家参考或者学习&#xff0c;获取源码请私聊我 需要定制请私聊 目 录 摘要 I Abstract II 1绪论 1 1.1研究背景与意义 1 1.1.1研究背景 1 1.1.2研究意义 1 1.2国内外研究…...

多人播报配音怎么弄?简单4招分享

想象一下&#xff0c;你手中的小说突然间活了起来&#xff0c;每个角色都有了自己的声音和情感。 这就是多人配音的魅力所在。它让文字跃然纸上&#xff0c;赋予了故事新的生命。 那么&#xff0c;如何制作一部引人入胜的小说呢&#xff1f;多人配音怎么制作的呢&#xff1f;…...

《Windows PE》4.1导入表

导入表顾名思义&#xff0c;就是记录外部导入函数信息的表。这些信息包括外部导入函数的序号、名称、地址和所属的DLL动态链接库的名称。Windows程序中使用的所有API接口函数都是从系统DLL中调用的。当然也可能是自定义的DLL动态链接库。对于调用方&#xff0c;我们称之为导入函…...

计算机专业大学生应该如何规划大学四年?

计算机专业的大学生在学习过程中应该注重以下几个方面&#xff0c;以确保他们在快速变化的技术领域中保持竞争力&#xff1a; 基础知识&#xff1a; 数学基础&#xff1a;离散数学、线性代数、概率论等数学课程对于理解算法和数据结构至关重要。编程基础&#xff1a;学习至少一…...

R知识图谱1—tidyverse玩转数据处理120题

以下是本人依据张老师提供的tidyverse题库自行刷题后的tidyverse Rmd文件&#xff0c;部分解法参考张老师提示&#xff0c;部分解法我本人灵感提供 数据下载来源https://github.com/zhjx19/tidyverse120/tree/main/data 参考https://github.com/MaybeBio/R_cheatsheet/tree/mai…...

【赵渝强老师】K8s中的有状态控制器StatefulSet

在K8s中&#xff0c;StatefulSets将Pod部署成有状态的应用程序。通过使用StatefulSets控制器&#xff0c;可以为Pod提供持久存储和持久的唯一性标识符。StatefulSets控制器与Deployment控制器不同的是&#xff0c;StatefulSets控制器为管理的Pod维护了一个有粘性的标识符。无论…...

机器学习笔记(持续更新)

使用matplotlib绘图&#xff1a; import matplotlib.pyplot as plt fig, axplt.subplots() #创建一个图形窗口 plt.show() #不绘制任何内容&#xff0c;直接显示空图 重复值处理&#xff1a; 重复值处理代码&#xff1a; import pandas as pd data pd.DataFrame({学号: [1…...

Nginx 配置之server块

在 Nginx 配置中使用两个 server 块是为了处理 HTTP 和 HTTPS 请求的不同需求。具体来说&#xff1a; 第一个 server 块&#xff1a; 监听 80 端口&#xff08;HTTP&#xff09;。将所有 HTTP 请求重定向到 HTTPS&#xff08;443 端口&#xff09;。 第二个 server 块&#xff…...

魅族Lucky 08惊艳亮相:极窄四等边设计引领美学新风尚

在这个智能手机设计趋于同质化的时代&#xff0c;魅族以其独特的设计理念和创新技术&#xff0c;再次为市场带来了一股清新之风。 近日&#xff0c;魅族全新力作——Lucky 08手机正式曝光&#xff0c;其独特的“极窄物理四等边”设计瞬间吸引了众多消费者的目光&#xff0c;而…...

自动化的抖音

文件命名 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…...

无人机之巡航控制篇

一、巡航控制的基本原理 无人机巡航控制的基本原理是通过传感器检测无人机的飞行状态和环境信息&#xff0c;并将其反馈给控制器。控制器根据反馈信息和任务需求&#xff0c;计算出无人机的控制指令&#xff0c;并将其发送给执行机构。执行机构根据控制器的控制指令&#xff0c…...

面试必问的7大测试分类!一文说清楚!

在日常测试工作中&#xff0c;我们经常会听到“单元测试&#xff0c;集成测试&#xff0c;系统测试”之类的词汇&#xff0c;大家都知道这是按照开发阶段进行测试活动的划分。 这种划分完整的分类&#xff0c;其实是分为四种“单元测试&#xff0c;集成测试&#xff0c;系统测…...

深信服上网行为管理AC无法注销在线用户

下图用户认证成功后无法注销 很多入网的用户都是使用的这个账号 针对单个IP强制注销也不生效 解决步骤&#xff1a; 接入管理-用户管理-用户绑定管理-用户绑定 删除绑定免认证的配置 删除后所有用户会强制注销掉&#xff0c;重新登录即可 可添加主页联系方式帮忙远程解决问…...

使用GitLab CI构建持续集成案例

1. 部署GitLab &#xff08;1&#xff09;基础准备 解压软件包并导入镜像&#xff1a; [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安装与配置

检查是否存在安装残留&#xff0c;移除可能会造成冲突的组件。 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&#xff1a; sudo apt-get update …...

使用vscode调试wails项目(golang桌面GUI)

文章目录 安装 Golang 环境安装 NPM安装 VSCode安装 Go 插件安装 Go 插件依赖工具安装 Wails系统检查 准备项目Visual Studio Code 配置安装和构建步骤参考资料 安装 Golang 环境 访问 golang 官网下载环境安装包&#xff1a;https://go.dev/dl/ 安装 NPM 从 Node 下载页面 …...

Java中注解与反射的详细介绍

注解和反射 一、注解 什么是注解&#xff1f;Annotation Override &#xff1a;表示一个方法声明打算重写超类的另一个方法声明Deprecated&#xff1a;表示不鼓励程序员使用这样的元素&#xff0c;&#xff08;此注释可以用于修饰方法&#xff0c;属性&#xff0c;类&#xf…...

Redis 过期时间删除策略详解

在使用 Redis 时&#xff0c;设置键的过期时间是一项非常有用的功能。它可以帮助我们自动清理不再需要的数据&#xff0c;节省内存空间。那么&#xff0c;Redis 是如何处理这些带有过期时间的键呢&#xff1f;这就涉及到 Redis 的过期时间删除策略。 一、Redis 过期键的判定 R…...

使用Taotoken后如何通过用量看板清晰掌握各模型API消耗情况

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 使用Taotoken后如何通过用量看板清晰掌握各模型API消耗情况 当你将多个大模型API的调用统一接入到Taotoken平台后&#xff0c;一个…...

给UR5e机械臂动力学建模做减法:一个简化模型在C++中的实现与验证

UR5e机械臂动力学建模的工程实践&#xff1a;从理论简化到C实现 在工业机器人领域&#xff0c;UR5e作为Universal Robots的经典协作机械臂&#xff0c;以其轻量化设计和安全性能广泛应用于装配、检测等场景。然而&#xff0c;当我们需要为其开发高级控制算法时&#xff0c;完整…...

分布式事务解决方案TCC实战

分布式事务解决方案TCC实战 一、分布式事务概述 在分布式系统中&#xff0c;事务跨越多个服务或数据库&#xff0c;传统的ACID事务无法直接适用&#xff0c;需要采用分布式事务解决方案。 1.1 分布式事务挑战 挑战说明网络延迟跨服务调用存在网络延迟和超时数据一致性多个数据源…...

CANN/hcomm集群信息初始化API

HcclCommInitClusterInfo 【免费下载链接】hcomm HCOMM&#xff08;Huawei Communication&#xff09;是HCCL的通信基础库&#xff0c;提供通信域以及通信资源的管理能力。 项目地址: https://gitcode.com/cann/hcomm 产品支持情况 Ascend 950PR/Ascend 950DT&#xff1…...

YOLOv8实时目标检测与自适应控制技术在游戏辅助系统中的应用研究

YOLOv8实时目标检测与自适应控制技术在游戏辅助系统中的应用研究 【免费下载链接】RookieAI_yolov8 基于yolov8实现的AI自瞄项目 AI self-aiming project based on yolov8 项目地址: https://gitcode.com/gh_mirrors/ro/RookieAI_yolov8 技术挑战剖析&#xff1a;实时游…...

答辩前一天才慌?paperxie 帮我把毕业论文 PPT 的 “地狱副本” 打成了 “新手教程”

paperxie-免费查重复率aigc检测/开题报告/毕业论文/智能排版/文献综述/AI PPThttps://www.paperxie.cn/ppt/createhttps://www.paperxie.cn/ppt/create 距离本科毕业论文答辩只剩 3 天&#xff0c;我对着空白的 PPT 页面&#xff0c;第 10 次删掉了刚写好的标题。 导师说我的内…...

在macOS上轻松运行Windows应用:Whisky完整使用指南

在macOS上轻松运行Windows应用&#xff1a;Whisky完整使用指南 【免费下载链接】Whisky A modern Wine wrapper for macOS built with SwiftUI 项目地址: https://gitcode.com/gh_mirrors/wh/Whisky 想在Apple Silicon Mac上直接运行Windows软件和游戏&#xff0c;又不想…...

爬虫进阶:如何用ProxyPool代理池+随机UA绕过掌上高考的反爬?保姆级避坑指南

数据采集实战&#xff1a;构建高隐蔽性教育信息采集系统的关键技术解析 教育数据采集领域近年来呈现出明显的技术对抗态势&#xff0c;平台方不断升级防御机制&#xff0c;而数据采集方则需要持续优化技术手段。本文将系统性地介绍构建高隐蔽性教育信息采集系统的完整技术方案&…...

2026年初中生赴新加坡留学,费用究竟几何?一文为你揭秘!

在教育全球化的今天&#xff0c;越来越多的家长将目光投向海外&#xff0c;新加坡凭借其优质的教育资源、安全的社会环境和多元的文化氛围&#xff0c;成为众多初中生留学的热门选择。那么&#xff0c;2026年初中生赴新加坡留学的费用到底是多少呢&#xff1f;本文将为你详细揭…...

从仿真到真车:如何用CARLA+Autoware搭建你的自动驾驶算法快速迭代工作流?

从仿真到真车&#xff1a;构建CARLAAutoware自动驾驶算法高效迭代体系 自动驾驶算法的开发如同在刀锋上行走——既要保证安全性&#xff0c;又要追求创新速度。当特斯拉的工程师们每天通过影子模式收集数百万英里的真实数据时&#xff0c;大多数团队却受限于路测成本与安全风险…...