通道计时器,处理事件的新思路

简介: 通道计时器,处理事件的新思路

概述

在 Go 语言中,通道(Channel)和计时器(Timer)是两个强大的并发工具,它们的结合使用可以优雅地处理各种事件。

本文将探讨如何使用通道响应计时器的事件,并通过详实的示例代码展示在不同场景下的应用。


 

1. 通道与计时器基础

1.1 通道的基本概念

通道是 Go 语言中并发编程的核心机制之一,用于在不同的 goroutine 之间传递数据。

make 函数创建


ch := make(chan int)

1.2 计时器的基本概念

计时器是 Go 语言中用于定时执行任务的工具,通过 time 包提供。

创建一个计时器


timer := time.NewTimer(time.Second)


 

2. 使用通道接收计时器事件

2.

package main
import (  "fmt"  "time")
func main() {  ch := make(chan string)
  go func() {    time.Sleep(2 * time.Second)    ch <- "事件发生"  }()
  select {  case msg := <-ch:    fmt.Println(msg)  case <-time.After(3 * time.Second):    fmt.Println("超时,未接收到事件")  }}

在上面示例中,创建了一个通道 ch,并在一个新的 goroutine 中等待 2 秒后往通道发送消息。

select 语句监听通道的消息和计时器的事件,哪个先到达就执行哪个。

2.2 计时器复用


package main
import (  "fmt"  "time")
func main() {  ch := make(chan string)  timer := time.NewTimer(2 * time.Second)
  go func() {    time.Sleep(1 * time.Second)    ch <- "事件发生"  }()
  select {  case msg := <-ch:    fmt.Println(msg)  case <-timer.C:    fmt.Println("超时,未接收到事件")  }}

在上述示例中,创建了一个计时器 timer,它设置为 2 秒。

同样,用 select 监听通道和计时器的事件,但这次用 timer.C 直接监听计时器的事件。


 

3. 使用通道控制计时器

3.1 通道关闭触发计时器


package main
import (  "fmt"  "time")
func main() {  ch := make(chan string)  timer := time.NewTimer(3 * time.Second)
  go func() {    time.Sleep(2 * time.Second)    close(ch)  }()
  select {    case msg, ok := <-ch:    if !ok {      fmt.Println("通道已关闭")      break    }    fmt.Println(msg)    case <-timer.C:    fmt.Println("超时,未接收到事件")  }}

在上面示例中,在 goroutine 中等待 2 秒后关闭通道。

用检查 ok 的值,可以知道通道是否已关闭,从而避免读取已关闭通道引发的异常。

3.

package main
import (  "fmt"  "time")
func main() {  ch := make(chan string, 1)  timer := time.NewTimer(3 * time.Second)
  go func() {    time.Sleep(2 * time.Second)    ch <- "事件发生"  }()
  select {  case msg := <-ch:    fmt.Println(msg)  case <-timer.C:    fmt.Println("超时,未接收到事件")  }}

在这个示例中,将通道 ch 设置为带缓冲的通道,容量为 1。

这样,即使计时器事件先到,通道也能接收到消息,因为有缓冲空间。


 

4. 实战场景

4.1

package main
import (  "fmt"  "time")
func main() {  ticker := time.NewTicker(1 * time.Second)  defer ticker.Stop()
  for {    select {    case <-ticker.C:      fmt.Println("定时任务执行")    }  }}

在上述示例中,使用 time.NewTicker 创建了一个定时器,并通过 select 监听定时器的事件。

在每次定时器触发时,执行相应的周期性任务。

4

package main
import (  "fmt"  "time")
func main() {  ch := make(chan string)
  select {  case msg := <-ch:    fmt.Println(msg)    case <-time.After(3 * time.Second):    fmt.Println("超时,未接收到事件")  }}

在上面示例中,用 time.After 函数创建一个计时器,当超时时,会向通道发送当前时间。

select 监听通道和计时器的事件,实现超时处理。


 

5. 总结

通过本文的讲解和示例代码,了解了如何使用通道响应计时器的事件。

通道和计时器的结合使用能够优雅地处理各种并发场景,包括超时处理、周期性任务等。

当然,使用通道来响应计时器也有一些注意事项:

通道操作需要确保同步正确,避免数据竞争

需要确保不会漏掉计时器的事件

重置计时器时要小心计时和通道处理的时序关系

在使用 Go 语言的并发编程特性时,记住思考通道、同步和事件顺序,这会帮助你编写出高质量和正确的 Go 程序。

目录
相关文章
滴滴抢单器全自动新款, 抢单加速器永久免费版,顺风车网约车autojs
包括订单检测、信息解析、条件筛选和自动接单等模块。使用时需要根据实际情况调整配置参数和优化UI元素定位逻辑
|
4月前
|
安全 Java API
Java 抽象类与接口在 Java17 + 开发中的现代应用实践解析
《Java抽象类与接口核心技术解析》 摘要:本文全面剖析Java抽象类与接口的核心概念与技术差异。抽象类通过模板设计实现代码复用,支持具体方法与状态管理;接口则定义行为规范,实现多态支持。文章详细对比了两者在实例化、方法实现、继承机制等方面的区别,并提供了模板方法模式(抽象类)和策略模式(接口)的典型应用示例。特别指出Java8+新特性为接口带来的灵活性提升,包括默认方法和静态方法。最后给出最佳实践建议:优先使用接口定义行为规范,通过抽象类实现代码复用,合理组合两者构建灵活架构。
81 2
|
4月前
|
机器学习/深度学习 存储 缓存
Chonkie:面向大语言模型的轻量级文本分块处理库
Chonkie是一个专为大语言模型(LLM)应用场景设计的轻量级文本分块处理库,提供高效的文本分割和管理解决方案。该库采用最小依赖设计理念,特别适用于现实世界的自然语言处理管道。本文将详细介绍Chonkie的核心功能、设计理念以及五种主要的文本分块策略。
192 0
Chonkie:面向大语言模型的轻量级文本分块处理库
|
4月前
|
弹性计算 SEO
基于阿里云ECS:搭建外贸独立站,3天被谷歌收录
最近帮一家南方纺织企业做了个独立站,从开发到上线就用了1周,开发费用才900块,让我意外的是,网站上线3天就被谷歌收录了!今天想和各位外贸老铁们分享一下这个经历。
116 1
|
6月前
|
传感器 SQL 运维
2025 年中国中小企业数字化转型:Websoft9 开源托管平台的价值
Websoft9 以开源技术为核心,打造零门槛、低成本的数字化基座,提供 200+ 开源模板(如 Odoo、Nextcloud),助力企业快速部署与扩展。通过容器化技术、多云适配及主动防御体系,保障安全与兼容性。行业级解决方案覆盖制造、教育、法律等领域,实现数据驱动决策闭环。生态创新模式鼓励技术反哺与商业裂变,形成“标准化模板 + 自由扩展”路径,使中小企业从技术消费者转型为生态共建者,推动数字化转型成为价值创造的永动机。
|
7月前
|
存储 人工智能 安全
AI战略丨全面投入升级 AI 大基建
云厂商拥有全栈技术储备,并通过基础设施的全面升级,让 AI 训练、推理、部署和应用整 个生命周期变得更高效。
|
8月前
|
人工智能 运维 监控
AI驱动的操作系统服务评测报告
作为一位运维工程师,我使用Alibaba Cloud Linux 3操作系统进行云资源的运维和管理。通过控制台可快速开通并管理云资源,界面简洁、功能明确。安装SysOM和OS Copilot组件简单高效,支持实时监控集群健康状况,并提供精准的系统诊断与优化建议。OS Copilot智能助手能有效解答技术问题,提升工作效率。针对EOL系统的订阅服务提供了安全迁移保障。整体体验优秀,尤其适合中小企业降低运维复杂度。建议进一步优化权限管理、增加报告导出功能及增强Copilot交互性。
|
10月前
|
机器学习/深度学习 人工智能 安全
并非只有AI-2025年工作技能报告
全球最大的在线学习平台Coursera发布《2025年工作技能报告》,报告基于500万企业学习者和7,000多家机构的数据分析,揭示了2025年全球劳动力所需的关键技能趋势。报告强调,随着GenAI的快速发展,相关技能的课程注册量同比增长了866%,显示出对AI能力的需求激增。
614 9
|
10月前
|
存储 自然语言处理 算法
【北京大学 软件工程】四、结构化分析方法
结构化分析方法是一种系统化的软件开发方法学,旨在通过使用问题域术语建立系统的功能模型,以明确“系统必须做什么”。该方法包括结构化分析、设计和程序设计三个主要部分。其核心工具是数据流图(DFD),用于表达系统功能模型,并结合数据字典定义数据流和数据存储。此外,还使用加工小说明(如判定表或判定树)描述加工逻辑。 结构化分析过程遵循自顶向下、逐步求精的原则,首先建立系统环境图确定边界,然后通过分解加工、分派数据流和引入文件来细化模型。整个过程中需确保模型平衡和信息组织的复杂性控制。最终输出为需求规格说明书(SRS),确保需求的正确性、无二义性、完整性和可验证性等特性。
|
11月前
|
机器学习/深度学习 人工智能 自然语言处理
探索深度学习的最新进展:Transformer模型的创新应用
探索深度学习的最新进展:Transformer模型的创新应用