Go 1.23 新特性:Timer 和 Ticker 的重要优化

news2024/11/28 6:47:20

作者:陈明勇

个人网站:https://chenmingyong.cn

文章持续更新,如果本文能让您有所收获,欢迎点赞收藏加关注本号。 微信阅读可搜《程序员陈明勇》。 这篇文章已被收录于 Github,欢迎大 家Star 催更并持续关注。

前言

Go 1.23 版本在北京时间 2024814 日凌晨 1:03 发布。该版本带来了多项重大更新,具体内容可以参考我之前的文章:Go 1.23 版本发布啦,这些重大更新你一定要知道!。本文将重点介绍其中关于定时器(TimerTicker)的优化。

准备好了吗?准备一杯你最喜欢的咖啡或茶,随着本文一探究竟吧。

程序员陈明勇.jpeg

Timer 和 Ticker 的基本概念

在深入探讨 Go 1.23 版本对 TimerTicker 定时器进行的优化之前,有的读者可能需要了解这两种定时器的基础知识。以下是关于这两种定时器的基本介绍:

  • Timer 是一个一次性的定时器,用于在未来的某一时刻执行一次操作。常用于单次延迟执行任务

  • Tciker 是一个周期性的定时器,用于在固定的时间间隔重复执行任务。它在每个间隔时间到来时,向其通道(Channel)发送当前时间。常用于重复执行任务

垃圾回收的改进

  • Go 1.23 之前的行为: 如果一个 TimerTicker 没有被显式调用 Stop 方法,即使程序不再引用它们,它们也不会立即被垃圾回收。Timer 会在触发后被回收,而 Ticker 则从来不会被自动回收。
  • Go 1.23 新行为: 如果程序不再引用一个 TimerTicker(即没有其他部分的代码持有它们的引用),即使没有调用 Stop 方法,它们也会有资格立即被垃圾回收。这可以减少内存泄漏的风险,因为不再需要显式调用 Stop 也可以保证资源会被回收。

这一更新提高了内存管理效率。以前,如果你创建了一个 TimerTicker,但忘记调用 Stop,这些对象会一直占用内存,直到程序结束。而现在,只要程序不再引用这些对象,它们就会被回收,这样可以避免内存泄漏的问题。

计时器通道行为的变化

  • Go 1.23 之前的行为:TimerTicker 关联的通道带有一个元素缓冲区,这导致 ResetStop 方法在调用后,可能仍会接收到之前准备好的旧值,造成使用上的困难。
  • Go 1.23 新行为: 计时器通道变成了无缓冲的(容量为 0)。这意味着在调用 ResetStop 方法后,Go 可以保证不会再接收到旧的值。这使得 ResetStop 的使用更加可靠。
  • 副作用: 由于通道现在是无缓冲的,lencap 操作返回的值变成了 0,而不是 1。这可能会影响那些依赖轮询通道长度来判断是否能成功接收值的代码。为了适应这种变化,代码应该使用 非阻塞 的接收操作来替代。

这一更新让定时器操作更加可靠和安全。 在 Go 1.23 之前,TimerTicker 的通道是有缓冲的,这意味着即使你调用了 ResetStop,通道中仍可能残留旧的定时信号,这会导致潜在的竞态条件问题。现在改为无缓冲通道后,Go 保证了调用 ResetStop 后,通道不会再收到旧的数据。

我们来看看下面的代码在不同 Go 版本里的运行情况:

package main

import (
	"fmt"
	"time"
)

func main() {
	// 程序退出信号
	quit := make(chan bool)
	timer := time.NewTimer(2 * time.Second)

	go func() {
		// 确保定时器已触发并发送信号
		time.Sleep(4 * time.Second)
		// 试图读取通道,看是否有值
		select {
		case t := <-timer.C:
			fmt.Println("接收到定时器信号:", t.Format(time.DateOnly))
		default:
			fmt.Println("无信号")
		}

		quit <- true
	}()

	// 确保定时器已触发并发送信号
	time.Sleep(3 * time.Second)
	wasStopped := timer.Stop()
	if wasStopped {
		// Go 1.23 或更高版本会走这条分支
		fmt.Println("定时器未过期,停止成功")
	} else {
		// Go 1.23 以前的版本会走这条分支
		fmt.Println("定时器已经过期并且信号已经发送")
	}

	// 等待退出信号
	<-quit
}

Go 1.22 及之前的版本的运行结果:

定时器已经过期并且信号已经发送
接收到定时器信号: 2024-08-20

由于通道是有缓冲的,在定时器过期时已经发送了信号,因此即使在定时器触发之后调用 Stop() 方法,我们仍然可以从缓冲中接收到信号。

Go 1.23 或更高版本的运行结果:

定时器未过期,停止成功
无信号

由于通道是无缓冲的,信号发送是一个阻塞操作。如果在信号被接收之前调用 Stop() 方法,这将阻止信号的发送。因此,定时器被成功停止,Stop() 返回 true

注意事项

对于 TimerTicker 的这些新行为只有在 Go 模块使用 go.mod 文件并且指定了 Go 1.23.0 或更高版本时才会生效。也就是说如果你的 Go 版本是 Go 1.23,但是你在 go.mod 文件里指定的 Go 版本小于 Go 1.23,那么这些新行为不会生效。

此外,如果你在 go.mod 文件里指定的 Go 版本大于等于 Go 1.23,你可以通过设置环境变量 GODEBUGasynctimerchan=1,从而恢复到之前异步通道的行为。

小结

本文详细介绍了在 Go 1.23 版本中对 TimerTicker 的重要优化,包括两个主要方面:垃圾回收的改进计时器通道行为的变化。改进后的垃圾回收机制有助于防止内存泄漏,而计时器通道的调整则确保在调用 ResetStop 之后,通道不会接收到任何旧数据,提高了定时器操作的可靠性和安全性。

后续将会分主题发布更多关于 Go 1.23 的详细更新内容。关注我,不错过任何精彩内容。

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

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

相关文章

js 实现对一个元素得拉伸

前言&#xff1a; 最近写一个项目遇到了需要拉伸调整一个元素得大小&#xff08;宽高&#xff09;。所以打算实现一下。 思路就是用 mousedown、mousemove、mouseup 来实现。 mousemove是动态获取坐标&#xff0c;然后 动态改变元素宽度 js自己实现&#xff1a; html里实现…

CentOS7发送邮件如何配置SMTP服务器发信?

CentOS7发送邮件安全设置&#xff1f;CentOS7发信性能优化方法&#xff1f; 对于使用CentOS7操作系统的用户而言&#xff0c;配置SMTP服务器以发送邮件是一个关键步骤。AokSend将详细介绍如何在CentOS7中配置SMTP服务器发信的方法和注意事项。 CentOS7发送邮件&#xff1a;准…

C#发邮件时如何确保邮件内容的安全和隐私?

C#发邮件性能优化的策略&#xff1f;如何设置C#发邮件的功能&#xff1f; 在使用C#发邮件时&#xff0c;如何确保邮件内容不被泄露、篡改或非法访问&#xff0c;已成为开发者需要面对的关键问题。AokSend将探讨在C#发邮件过程中&#xff0c;确保邮件内容安全和隐私的几种有效方…

你也想转行成为一名程序员吗?作为过来人的我希望你想清楚这几个问题再做决定

1 有个朋友突然找我&#xff1a;“现在的工作不想干了&#xff0c;我现在转行搞IT能不能行&#xff1f;学哪个编程语言比较有前景&#xff1f;现在去搞网络安全应该没问题吧&#xff1f;”我相信&#xff0c;很多人出于各种原因都在考虑要不要进行职业转换&#xff0c;迷茫又焦…

2024年最新Pycharm专业版激活码+Pycharm详细安装汉化教程

一、PyCharm激活 激活码&#xff1a; KQ8KMJ77TY-eyJsaWNlbnNlSWQiOiJLUThLTUo3N1RZIiwibGljZW5zZWVOYW1lIjoiVW5pdmVyc2l0YXMgTmVnZXJpIE1hbGFuZyIsImxpY2Vuc2VlVHlwZSI6IkNMQVNTUk9PTSIsImFzc2lnbmVlTmFtZSI6IkpldOWFqOWutuahtiDorqTlh4blupflkI0iLCJhc3NpZ25lZUVtYWlsIjoi…

动态规划part13

647. 回文子串 给定一个字符串&#xff0c;你的任务是计算这个字符串中有多少个回文子串。 具有不同开始位置或结束位置的子串&#xff0c;即使是由相同的字符组成&#xff0c;也会被视作不同的子串。 class Solution:def countSubstrings(self, s: str) -> int:dp [[Fa…

Chat App 项目之解析(九)

Chat App 项目介绍与解析&#xff08;一&#xff09;-CSDN博客文章浏览阅读468次&#xff0c;点赞12次&#xff0c;收藏3次。Chat App 是一个实时聊天应用程序&#xff0c;旨在为用户提供一个简单、直观的聊天平台。该应用程序不仅支持普通用户的注册和登录&#xff0c;还提供了…

ArcGIS小技巧:编辑一个面的边界时,如何让相邻面同步修改

欢迎关注同名微信公众号&#xff0c;更多文章推送&#xff1a; 在ArcGIS中手动编辑2个相邻面的共同边界时&#xff0c;通常需要2个面都跟着修改&#xff1a; 一般做法是用【整形要素工具】&#xff0c;但是【整形要素工具】不能选择多个要素执行&#xff0c;所以需要执行2次&am…

GoFly框架登录Token使用

token是验证请求接口用户身份的标识&#xff0c;框架建议开发者在识别用户身份时使用token尽量不要明文传用户标识数据。 一、生成用户登录token 通过routeuse.GenerateToken生成登录token&#xff0c;方法返回生成的token字符串和err错误提示&#xff0c;其中routeuse.UserC…

删除或丢失的移动硬盘数据如何恢复?三种办法助你找回宝贵资料

在数字化时代&#xff0c;移动硬盘已成为我们存储重要数据不可或缺的工具。然而&#xff0c;数据丢失或误删除的情况时有发生&#xff0c;让人倍感焦虑。别担心&#xff0c;本文将为你详细介绍如何恢复删除或丢失的移动硬盘数据&#xff0c;帮助你找回那些宝贵的资料。 一、检…

太仓自闭症谱系(ASD)儿童

在我国&#xff0c;自闭症谱系&#xff08;ASD&#xff09;儿童被称为“星星的孩子”&#xff0c;他们犹如夜空中闪烁的星星&#xff0c;孤独而遥远。为了关爱这些特殊的孩子&#xff0c;让他们更好地融入社会&#xff0c;太仓市星星雨特殊儿童康复中心应运而生。这家康复中心致…

【YashanDB认证】YCA学习记录

第一章&#xff1a;YashanDB基础介绍 国产化数据库的发展及未来 崖山数据库系统&#xff1a;YashanDB是【深圳计算科学研究院】完全自主研发设计的新型数据库系统&#xff0c;经过工信部下述机构权威检测&#xff0c;内核代码自主率100%。 YashanDB 核心交易型数据库 企业级…

拆卸并简单分析一个充电宝线路板

原因 一个很久的充电宝&#xff0c;电量完全不能满足使用&#xff0c;拆解下来的保护板分析 结构图解 除了下图&#xff0c;还有一些外围电路 工作原理图解 电池保护芯片XB8606A&#xff08;停产&#xff09; VM连接的是充电口的负极&#xff0c;而这个芯片通过控制电池…

IEEEtran类模板中算法Algorithm的写法

1、注释掉默认的引用 % \usepackage{algorithmic} % \usepackage{algorithm}2、在\begin{document}之前加以下内容 \usepackage[ruled,norelsize,vlined,linesnumbered]{algorithm2e} \makeatletter \newcommand{\removelatexerror}{\let\latexerror\gobble} \makeatother3、…

2 kubeflow系统架构 学习笔记

1 Kubeflow生态系统 2 生态系统说明 2.1. Hardware&#xff08;硬件层&#xff09; 提供计算资源的底层硬件支持。GPU&#xff08;如NVIDIA&#xff09;通常用于加速机器学习和深度学习的计算任务&#xff0c;而Intel和AMD则可能提供CPU计算资源。 2.2. Infrastructure&…

线程池【详解】

线程池 1、 线程池概念 如果有非常多的任务需要非常多的线程来完成,每个线程的工作时间不长,就需要创建很多线程,工作完又立即销毁[线程频繁创建和销毁线程] 频繁创建和销毁线程非常消耗性能,那么线程池,就是可以创建一些线程,放在"池子"中,用的时候去池子取一个线…

RJ45网口链接器和PCB板结构再生产上需要注意那些方面

华强盛电子导读&#xff1a;工程技术前面199中间2643后面0038 关于网口和PCB板板结合插件会出现几个问题 ...网口的尺寸结构&#xff0c;PCB板板的孔位小&#xff0c;这里强调&#xff0c;建议孔位开大一点&#xff0c;便于生产插件方便。 在插件生产过程中&#xff0c;RJ45网…

免费批量自动校正图片、PDF文档方向工具

功能介绍&#xff1a;批量自动识别图片和PDF文档页面方向&#xff0c;并校正为正确阅读方向&#xff08;非倾斜纠偏&#xff09; jpg校正演示 #修复exif信息导致的jpg图像显示和实际旋转不一致问题 #增加图像DPI选项,优先原图或者固定DPI&#xff0c;但这些只会对产生旋转的图…

qss的border-image和background-image和background-coloor和color

如果你的图片和按钮一样大&#xff0c;譬如40X40&#xff0c;那么两者都可以。 如果你的图片和按钮不一样大&#xff0c;用border-image会填充或者拉伸缩放以自适应按钮。 background-image则不会。 所以一般情况下&#xff0c;使用border-image会更合适。 border-image&…

深度学习入门:卷积神经网络 | CNN概述,图像基础知识,卷积层,池化层(超详解!!!)

目录 &#x1f354; 前言 &#x1f354; 图像基础知识 1. 像素和通道的理解 2. 小节 &#x1f354; 卷积层 1. 卷积计算 2. Padding 3. Stride 4. 多通道卷积计算 5. 多卷积核卷积计算 6. 特征图大小 7. PyTorch 卷积层 API 7. 小节 &#x1f354; 池化层 1. 池…