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

发布于:2024-10-24 编辑:匿名 来源:网络

前言 北京时间 8 月 14 日凌晨 1:03,Go 1.23 版本发布。该版本带来了多项重大更新。

具体可以参考我之前的文章:Go 1.23版本发布。这些重大更新你一定要知道! 。

本文将重点讨论定时器(Timer 和 Ticker)的优化。你准备好了吗?喝一杯您最喜欢的咖啡或茶,然后按照本文查找答案。

Timer 和 Ticker 的基本概念 在深入研究 Go 1.23 版本中 Timer 和 Ticker 定时器的优化之前,有些读者可能需要了解这两个定时器的基本知识。下面是对这两个定时器的基本介绍: Timer是一次性定时器,用于在未来某一时间执行一项操作。

常用于任务的单次延迟执行。 Tciker是一个周期性定时器,用于以固定的时间间隔重复执行任务。

当每个间隔时间到来时,它会将当前时间发送到其通道(Channel)。通常用于执行重复性任务。

关于Timer和Ticker的更多详细信息,请参考我之前的文章:Go Timer:Timer和Ticker。垃圾收集 Pre-Go 1.23 行为的改进:如果 Timer 或 Ticker 没有显式调用 Stop 方法,则即使程序不再引用它们,它们也不会立即被垃圾收集。

Timer触发后会被回收,而Ticker永远不会被自动回收。 Go 1.23 中的新行为:如果程序不再引用 Timer 或 Ticker(即代码的其他部分没有引用它们),则即使未调用 Stop 方法,它们也有资格立即进行垃圾回收。

这降低了内存泄漏的风险,因为不再需要显式调用 Stop 并且保证资源被回收。此更新提高了内存管理效率。

以前,如果您创建了 Timer 或 Ticker 但忘记调用 Stop,这些对象将占用内存直到程序结束。现在,只要程序不再引用这些对象,它们就会被回收,从而避免了内存泄漏的问题。

Timer 通道行为的变化 Go 1.23 之前的行为:与 Timer 或 Ticker 关联的通道有一个元素缓冲区,这导致 Reset 或 Stop 方法调用后仍然接收之前准备的旧值,造成使用困难。Go 1.23 中的新行为:计时器通道变为无缓冲(容量为 0)。

这意味着在调用 Reset 或 Stop 方法后,Go 保证不会再次收到旧值。这使得 Reset 和 Stop 的使用更加可靠。

副作用:由于通道现在是无缓冲的,因此 len 和 cap 操作返回的值变为 0 而不是 1。这可能会影响依赖轮询通道长度来确定是否可以成功接收值的代码。

为了适应这一变化,代码应该使用非阻塞接收操作。此更新使计时器操作更加可靠和安全。

在 Go 1.23 之前,Timer 和 Ticker 通道是缓冲的,这意味着即使您调用 Reset 或 Stop,旧的计时信号可能仍保留在通道中,从而导致潜在的竞争条件。现在,在更改为无缓冲通道后,Go 保证该通道在调用 Reset 或 Stop 后将不再接收旧数据。

我们来看看以下代码在不同 Go 版本中的运行情况: 代码语言: go copy package mainimport ("fmt" "time")func main() {// 程序退出信号 quit := make(chan bool)timer : = time.NewTimer(2 * time.Second)go func() {// 确保定时器已经触发并发送信号 time.Sleep(4 * time.Second)// 尝试读取通道,看是否有a value 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("定时器已超时,信号已发送") }// 等待退出Go 1.22及之前版本运行结果中的signal <-quit}: 代码语言: shell复制定时器已过期,信号已发送。定时器信号已收到:08-20 由于通道是缓冲的,当定时器到期时信号已发送,因此即使在定时器触发后调用 Stop() 方法,我们仍然可以从缓冲区接收信号。

Go 1.23以上运行结果: 代码语言:shell复制定时器未过期,无信号停止成功 由于通道是无缓冲的,信号发送是一个阻塞操作。如果在接收到信号之前调用 Stop() 方法,这将阻止信号发送。

因此,计时器成功停止并且 Stop() 返回 true。注意:只有当 Go 模块使用 go.mod 文件并指定 Go 1.23.0 或更高版本时,定时器和 Ticker 的这些新行为才会生效。

也就是说,如果你的Go版本是Go 1.23,但是你在go.mod文件中指定的Go版本小于Go 1.23,这些新行为将不会生效。另外,如果您在 go.mod 文件中指定的 Go 版本大于或等于 Go 1.23,您可以通过在环境变量 GODEBUG 中设置 asynctimerchan=1 来恢复之前的异步通道行为。

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

有关 Go 1.23 的更多详细更新将在未来按主题发布。关注我,不错过任何精彩内容。

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

站长声明

版权声明:本文内容由互联网用户自发贡献,本站不拥有所有权,不承担相关法律责任。如果发现本站有涉嫌抄袭的内容,欢迎发送邮件 举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。

标签:

相关文章

  • 沃峰科技助力企业客户服务升级,全面解决全国门店运维问题

    沃峰科技助力企业客户服务升级,全面解决全国门店运维问题

    .wp-block-column h3{margin-left:0} 在快速发展的商业环境中,企业客户服务始终是关键竞争力一。 然而,全国不少企业在门店运维服务中面临数字化系统缺失、智能化不足、线上线下分离等一系列挑战,直接影响服务效率和客户满意度。 针对这些痛点,沃峰科技推出了一整套覆盖全

    06-18

  • 诺初美创获数千万元天使轮融资,时代伯乐、莱斯创投联合投资

    诺初美创获数千万元天使轮融资,时代伯乐、莱斯创投联合投资

    投资圈(ID:pedaily)据6月8日消息,跨境智能家居品牌“诺初美创”已近期完成数千万元天使轮融资。 本轮融资由时代伯乐和莱斯创投共同投资。 本次募集资金将主要用于新产品研发。 诺初美创于今年8月上台。 面向25-45岁的家庭消费者,专注于家庭消费场景的产品创新和品牌运营

    06-17

  • 重庆两江新区设立4支新产业基金 总规模45.5亿

    重庆两江新区设立4支新产业基金 总规模45.5亿

    据投资界9月22日消息,重庆两江战略基金举办重点合作项目专场签约活动,设立4支新产业基金,并签约5个投资协议。 总投资规模45.5亿元。 签约项目涵盖大健康、智能制造、新基建、航空航天、人工智能、国际贸易、数字经济等多个产业领域,将助力两江新区进一步深化大数据智能创

    06-17

  • Xilinx 首席执行官概述公司新愿景和战略蓝图

    Xilinx 首席执行官概述公司新愿景和战略蓝图

    2020 年 3 月 19 日,加利福尼亚州圣何塞 — 全球自适应和智能计算领导者 Xilinx, Inc.(纳斯达克代码:XLNX)总裁兼首席执行官(首席执行官彭维克今天透露了公司的未来愿景和战略蓝图。 Peng的愿景是为Xilinx带来新发展、新技术和新方向,打造“自适应计算加速平台”。 在这

    06-06

  • 小家电品牌“豆禾科技”获近亿元A轮融资,

    小家电品牌“豆禾科技”获近亿元A轮融资,

    深耕供应链的小家电品牌“豆禾科技”已完成近亿元A轮融资。 本轮融资由鸿章资本投资,Verity Capital 跟投。 独家财务顾问。 本轮融资将主要用于产品研发、供应链升级、企业信息化建设等。

    06-17

  • 喝了还能降解的“食用标签”让假酒、假药无处藏身

    喝了还能降解的“食用标签”让假酒、假药无处藏身

    食品药品安全时刻关系着人们的生活。 然而,各类假冒伪劣产品始终令人防不胜防。 想要辨别真伪,可能需要有“火眼金睛”,但显然不可能每个人都具备这样的能力。 然而,在现代社会,你可以用科技来辅助。 ▲ 图片来自:Unsplash 美国印第安纳州Purdue大学和韩国国家农业科学

    06-21

  • Whole House Premium对美国第一贸易公司进行数百万美元战略投资

    Whole House Premium对美国第一贸易公司进行数百万美元战略投资

    据投资界8月7日消息,国内一站式家居软装解决方案Whole House Premium,近期又有新动作。 他向美国第一家贸易公司First Trade投资100万,并正式成为First Trade的股东。   全屋优品创始人周志胜介绍,公司已完成1万元B轮融资。 全屋优品成立仅两年,就以其对市场整体专业的

    06-18

  • 台积电抢购EUV光刻机加速7nm-5nm量产进程

    台积电抢购EUV光刻机加速7nm-5nm量产进程

    日前,荷兰半导体设备制造商ASML(阿斯麦)在财报发布会上表示,ASML将采用极紫外光刻机(EUV) 2020年,年出货量从18台增至30台,外媒报道称,晶圆代工厂龙头台积电将抢占30台EUV台的一半以上。 这也将使台积电成为今年的第一。 包含EUV技术的增强型7纳米工艺可于第一季度中

    06-06

  • 挑战闲鱼、转转,京东正式推出“拍拍二手”,会扰乱二手车市场吗?

    挑战闲鱼、转转,京东正式推出“拍拍二手”,会扰乱二手车市场吗?

    二手交易平台以“焕然一新”迎接新玩家。 12月21日,刘强东宣布京东正式上线“拍拍二手”品牌。 它将采用平台化运营思路,整合回收、检测、再加工、销售等逆向供应链资源,高举“品质二手”大旗。 将京东联盟生态拓展至二手商品交易领域。 拍拍二手是由拍拍网发展而来,拍拍网

    06-17

  • 徐小平:创业者看不起英雄,不愿意给他钱

    徐小平:创业者看不起英雄,不愿意给他钱

    在天使来华“两会大众创业”年度盛典上,徐小平回忆起一年来令他印象深刻的一件事: 2018年10月在北大演讲时,一名学生告诉他,学生中存在着职业鄙视链:在四大工作的人鄙视在快消工作的人,在咨询工作的人鄙视在四大工作的人,在投行工作的人鄙视在咨询工作的人,在PE工作的

    06-18

  • 超过110亿元!北汽新能源汽车创下行业最大单笔融资,为何全部退出……

    超过110亿元!北汽新能源汽车创下行业最大单笔融资,为何全部退出……

    过亿的融资金额对于新能源来说算大吗?    据投资界8月14日消息,北汽新能源今日正式宣布,公司已完成总额1800万元B轮融资,中国信达、中基投资、兴旺产业园、国轩投资共14家投资者参与了本轮融资。   创下新能源汽车行业单笔最大融资纪录,并已在筹备IPO。    据了解

    06-18

  • 市值破万亿,王传福表弟一次性返还5万倍

    市值破万亿,王传福表弟一次性返还5万倍

    这是一个里程碑时刻——6月10日,比亚迪股价创历史新高,市值首次突破万亿,成为第一个加入万亿美元市值俱乐部的中国人。 汽车公司。 早在2009年,29岁的王传福在深圳创立了比亚迪。 从一块小小的手机电池起家,后来打造了一个巨大的新能源汽车版图:新能源汽车、动力电池、半

    06-17