Go 定时器使用技巧:避免常见陷阱

简介: Go 定时器使用技巧:避免常见陷阱

Go 定时器使用技巧:避免常见陷阱

Go 的定时器(time.Timertime.Ticker)是并发编程的常用工具,但使用不当会导致资源泄漏甚至程序崩溃。以下是几个关键技巧。

1. 确保 Timer 资源释放

time.After 函数返回一个 channel,但背后的 Timer 在到期前不会被垃圾回收。如果在 select 中频繁使用 time.After(如循环内),会导致大量未过期的 Timer 残留。

错误示例:

for {
   
    select {
   
    case <-ch:
        // 处理
    case <-time.After(5 * time.Second):
        // 超时
    }
}

改进: 使用 time.NewTimer 并手动停止。

timer := time.NewTimer(5 * time.Second)
for {
   
    select {
   
    case <-ch:
        // 处理
    case <-timer.C:
        // 超时
    }
    if !timer.Stop() {
   
        <-timer.C
    }
    timer.Reset(5 * time.Second)
}

2. Ticker 必须显式停止

time.Ticker 如果不停止,会持续消耗系统资源。使用 defer ticker.Stop() 确保释放。

ticker := time.NewTicker(1 * time.Second)
defer ticker.Stop()

for range ticker.C {
   
    // 周期性任务
}

3. 正确处理 Timer 的 Stop 返回值

timer.Stop() 返回 false 表示 Timer 已经触发,此时需要清空 channel,否则后续 Reset 可能导致 channel 阻塞。

if !timer.Stop() {
   
    select {
   
    case <-timer.C:
    default:
    }
}
timer.Reset(duration)

4. 使用 time.AfterFunc 避免阻塞

time.AfterFunc 在指定时间后启动一个 goroutine 执行函数,不阻塞当前协程。适合延迟任务。

time.AfterFunc(10*time.Second, func() {
   
    fmt.Println("10秒后执行")
})

掌握这些技巧,能让你写出更健壮的 Go 定时器代码,避免资源泄漏和意外行为。

目录
相关文章
|
5月前
|
安全 PHP 开发者
PHP 8 新特性:Match表达式,让代码更简洁
PHP 8 新特性:Match表达式,让代码更简洁
|
网络协议 安全 Linux
Linux防火墙--IPtables配置策略思路
Linux防火墙--IPtables配置策略思路 防火墙定义:是通过有机结合各类用于安全管理与筛选的软件和硬件设备,帮助计算机网络于其内、外网之间构建一道相对隔绝的保护屏障,以保护用户资料与信息安全性的一种技术。 防火墙发展应用:最早是ipfwadm和ipchains(Redhat7.0), 其次是iptables,Centos7开始后friewalld迅速发展,对iptables进行了 改良,目前还是iptables用的比较多。
800 0
Linux防火墙--IPtables配置策略思路
|
传感器 机器学习/深度学习 存储
登顶KITTI和NuScenes | 2DPASS:2D先验辅助的激光雷达点云语义分割!ECCV2022
语义分割在大规模室外场景理解中起着至关重要的作用,在自动驾驶和机器人技术中有着广泛的应用[1-3]。在过去几年中,研究界投入了大量精力,使用相机图像[4-7]或激光雷达点云[2,8-12]作为输入来理解自然场景。
登顶KITTI和NuScenes | 2DPASS:2D先验辅助的激光雷达点云语义分割!ECCV2022
|
JSON Prometheus 监控
ClickHouse监控系统Prometheus+Grafana
ClickHouse监控系统Prometheus+Grafana
2753 0
|
测试技术 应用服务中间件 网络安全
【Apache】Apache ab压力测试工具Window下载和用法详解
【Apache】Apache ab压力测试工具Window下载和用法详解
1421 0
|
Java 网络安全 开发工具
群晖DS218+部署GitLab
家里的群晖用来装上GitLab,可以保存代码,也可以执行GitLab CI
1025 1
群晖DS218+部署GitLab
|
Go 开发者
Golang深入浅出之-Go语言项目构建工具:Makefile与go build
【4月更文挑战第27天】本文探讨了Go语言项目的构建方法,包括`go build`基本命令行工具和更灵活的`Makefile`自动化脚本。`go build`适合简单项目,能直接编译Go源码,但依赖管理可能混乱。通过设置`GOOS`和`GOARCH`可进行跨平台编译。`Makefile`适用于复杂构建流程,能定义多步骤任务,但编写较复杂。在选择构建方式时,应根据项目需求权衡,从`go build`起步,逐渐过渡到Makefile以实现更高效自动化。
757 2
|
存储 Java API
Java中的CQRS和事件溯源模式解析
Java中的CQRS和事件溯源模式解析
|
关系型数据库 MySQL Linux
Docker安装mysql详细教程, mysqld: Can‘t read dir of ‘/etc/mysql/conf.d/‘(报错已解决)
Docker安装mysql详细教程, mysqld: Can't read dir of '/etc/mysql/conf.d/' (Errcode: 2 - No such file or directory) 已解决
|
JSON API Go
开箱即用的 GoWind Admin|风行,企业级前后端一体中后台框架:集成 Swagger UI 打造交互式 API 文档
GoWind Admin(风行)是基于 Kratos 的企业级中后台框架,集成 Swagger UI 实现交互式 API 文档。通过 Protobuf 自动生成 OpenAPI v3 规范文档,利用 `//go:embed` 嵌入服务,一键部署可视化调试界面,提升前后端协作效率,开箱即用。
862 1
开箱即用的 GoWind Admin|风行,企业级前后端一体中后台框架:集成 Swagger UI 打造交互式 API 文档

热门文章

最新文章