首页 > 后端开发 > Golang > 正文

Golangtime/ticker周期任务与定时器使用

P粉602998670
发布: 2025-09-15 11:19:01
原创
921人浏览过
time.Ticker用于周期性任务,如每2秒触发一次;2. time.Timer用于单次延迟执行,如1秒后触发;二者均需注意资源释放与并发安全。

golangtime/ticker周期任务与定时器使用

在Go语言中,time.Tickertime.Timer 是实现周期性任务和延时执行的常用工具。它们都基于 time 包,但用途不同:Timer 用于“未来某一时刻执行一次”,Ticker 用于“每隔一段时间重复执行”。下面分别介绍它们的使用方法和注意事项。

1. time.Ticker:周期性任务

time.Ticker 用于周期性地触发事件,比如每5秒上报一次状态、每分钟检查一次服务健康等。

创建一个 Ticker 后,它会按照设定的时间间隔持续发送时间信号到其 Channel 中。

示例:每2秒打印一次当前时间

立即学习go语言免费学习笔记(深入)”;

package main
<p>import (
"fmt"
"time"
)</p><p>func main() {
ticker := time.NewTicker(2 * time.Second)
defer ticker.Stop() // 避免资源泄漏</p><pre class="brush:php;toolbar:false;"><pre class="brush:php;toolbar:false;">for {
    select {
    case t := <-ticker.C:
        fmt.Println("Tick at", t)
    }
}
登录后复制

}

关键点:

  • 使用 time.NewTicker(duration) 创建周期性定时器。
  • 必须调用 ticker.Stop() 停止,否则会导致 goroutine 和内存泄漏。
  • 适用于需要“重复执行”的场景,如监控、轮询等。

2. time.Timer:单次延迟执行

time.Timer 表示在未来某个时间点触发一次通知,常用于延迟操作或超时控制。

示例:1秒后执行打印

AppMall应用商店
AppMall应用商店

AI应用商店,提供即时交付、按需付费的人工智能应用服务

AppMall应用商店 56
查看详情 AppMall应用商店

package main
<p>import (
"fmt"
"time"
)</p><p>func main() {
timer := time.NewTimer(1 * time.Second)</p><pre class="brush:php;toolbar:false;"><pre class="brush:php;toolbar:false;"><-timer.C
fmt.Println("Timer expired")
登录后复制

}

常见用途:

  • 实现函数延迟执行。
  • 配合 select 实现 channel 超时机制。
  • 可重置(Reset)后再次使用,但需注意并发安全。

示例:带超时的 channel 操作

select {
case msg := <-ch:
    fmt.Println("Received:", msg)
case <-time.After(2 * time.Second):
    fmt.Println("Timeout, no message received")
}
登录后复制

注意: time.After(d) 内部创建了一个 Timer 并返回其 Channel,适合一次性超时场景。如果频繁使用建议手动管理 Timer 以避免资源浪费。

3. 如何选择 Timer 和 Ticker?

根据任务类型决定使用哪一个:

  • 需要每隔一段时间执行一次 → 使用 Ticker
  • 只需要执行一次,延迟或超时 → 使用 Timertime.After
  • 想实现“每隔一段时间执行,但可能中途停止” → Ticker + goroutine + stop 信号

进阶技巧:可控的周期任务

func startTask() {
    ticker := time.NewTicker(5 * time.Second)
    defer ticker.Stop()
<pre class="brush:php;toolbar:false;"><pre class="brush:php;toolbar:false;">for {
    select {
    case <-ticker.C:
        fmt.Println("Running periodic task...")
        // 执行具体任务
    case <-stopCh:
        fmt.Println("Stopping task...")
        return
    }
}
登录后复制

}

通过传入 stopCh 可优雅关闭周期任务。

基本上就这些。掌握好 Ticker 和 Timer 的区别与用法,能有效处理Go中的时间相关逻辑,关键是记得及时 Stop,避免泄露。

以上就是Golangtime/ticker周期任务与定时器使用的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号