Go进阶之定时器Ticker的实现示例

 更新时间:2026年02月10日 10:41:23   作者:H_拾忆  
本文主要介绍了Go进阶之定时器Ticker的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

Ticker是周期性定时器.即周期性的触发一个事件.通过Ticker本身提供的管道将事件

传递出去.

Ticker数据结构:

源码位置:src/time/tick.go

type Ticker struct {
    C          <-chan Time // The channel on which the ticks are delivered.
    initTicker bool
}

Ticker对外仅暴露了一个channel.当指定时间到来时就往该channel中写入系统时

间.即一个事件.

1.简单定时任务:

func main() {
    ticker := time.NewTicker(1 * time.Second)

    defer ticker.Stop()

    for range ticker.C {
       log.Println("tick")
    }
}

执行结果:

定时聚合任务:

示例:

func TickerLaunch() {
    //5分钟执行一次.
    ticker := time.NewTicker(5 * time.Minute)

    defer ticker.Stop()
    maxPassenger := 30
    passengers := make([]string, 0, maxPassenger)
    for {
       passenger := GetNewPassenger()
       if passenger != "" {
          passengers = append(passengers, passenger)
       } else {
          time.Sleep(1 * time.Second)
       }
       select {
       case <-ticker.C:
          Launch(passengers)
          passengers = []string{}
       default:
          if len(passengers) >= maxPassenger {
             Launch(passengers)
             passengers = []string{}
          }
       }
    }
}

func Launch(passengers []string) {
    for i := range passengers {
       fmt.Println(passengers[i], "发车了")
    }
}

func GetNewPassenger() string {
    return "乘客"
}

2.Ticker对外接口:

1)创建定时器:

源码位置:src/time/tick.go

func NewTicker(d Duration) *Ticker {
    if d <= 0 {
       panic("non-positive interval for NewTicker")
    }
    // Give the channel a 1-element time buffer.
    // If the client falls behind while reading, we drop ticks
    // on the floor until the client catches up.
    c := make(chan Time, 1)
    t := (*Ticker)(unsafe.Pointer(newTimer(when(d), int64(d), sendTime, c, syncTimer(c))))
    t.C = c
    return t
}

2).停止定时器:

源码位置:src/time/tick.go

// Stop turns off a ticker. After Stop, no more ticks will be sent.
// Stop does not close the channel, to prevent a concurrent goroutine
// reading from the channel from seeing an erroneous "tick".
func (t *Ticker) Stop() {
    if !t.initTicker {
       // This is misuse, and the same for time.Timer would panic,
       // but this didn't always panic, and we keep it not panicking
       // to avoid breaking old programs. See issue 21874.
       return
    }
    stopTimer((*Timer)(unsafe.Pointer(t)))
}

流程图:

总流程图:

3.简单接口:

在有些场景下.启动一个定时器后.该定时器永远不会停止.比如定时轮询任务.此时可

以使用一个简单的Tick函数来获取定时器的管道.函数如下:

源码位置:src/runtime/tick.go

func Tick(d Duration) <-chan Time {
    if d <= 0 {
       return nil
    }
    return NewTicker(d).C
}

从源码可以看出其实是创建了一个Ticker.然后只返回了管道.并没有返回ticker.所以

没有办法停止.

4.错误示例:

当Ticker用于for循环时.很容易出现意想不到的资源泄漏问题.

示例:

func WrongTicker() {
    for  {
       select {
       case <-time.Tick(time.Second):
          log.Printf("resource leak!")
       }
    }
}

上面的代码.select每次检测case语句都会创建一个定时器.for循环又会不断的执行

select语句.系统里会有越来越多的定时器不断地消耗CPU资源.最终CPU资源被耗

到此这篇关于Go进阶之定时器Ticker的实现示例的文章就介绍到这了,更多相关Go 定时器Ticker内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Go中strings的常用方法详解

    Go中strings的常用方法详解

    这篇文章主要介绍了Go中strings的常用方法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-03-03
  • Windows中Golang编译运行缓慢的解决方法

    Windows中Golang编译运行缓慢的解决方法

    Go语言编译运行缓慢问题可能是由于Windows 11更新引入的PCManagerServiceStore进程导致的,该进程会强制检查Go代码编译过程,消耗大量系统资源,下面就来介绍一下该问题的解决
    2025-08-08
  • Go 语言单例模式示例详解

    Go 语言单例模式示例详解

    这篇文章主要为大家介绍了Go 语言单例模式示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-10-10
  • golang 实现一个restful微服务的操作

    golang 实现一个restful微服务的操作

    这篇文章主要介绍了golang 实现一个restful微服务的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-04-04
  • go语言实现字符串与其它类型转换(strconv包)

    go语言实现字符串与其它类型转换(strconv包)

    strconv包是Go语言标准库的一部分,主要提供字符串与基本数据类型之间的转换功能,使用strconv包可以方便地在不同类型之间进行转换,满足日常编程中的需求,感兴趣的可以了解一下
    2024-10-10
  • Golang 基础之函数使用(匿名递归闭包)实例详解

    Golang 基础之函数使用(匿名递归闭包)实例详解

    这篇文章主要为大家介绍了Golang 基础之函数使用(匿名递归闭包)实例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-10-10
  • 一文带你使用Golang实现SSH客户端

    一文带你使用Golang实现SSH客户端

    SSH 全称为 Secure Shell,是一种用于安全地远程登录到网络上的其他计算机的网络协议,本文主要为大家详细介绍了如何使用 Golang 实现 SSH 客户端,需要的可以参考下
    2023-11-11
  • Golang 中反射的应用实例详解

    Golang 中反射的应用实例详解

    这篇文章主要为大家介绍了Golang 中反射的应用实例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-08-08
  • go语言channel实现多核并行化运行的方法

    go语言channel实现多核并行化运行的方法

    这篇文章主要介绍了go语言channel实现多核并行化运行的方法,实例分析了channel实现多核并行化运行的技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-03-03
  • Go中的fuzz模糊测试使用实战详解

    Go中的fuzz模糊测试使用实战详解

    这篇文章主要为大家介绍了Go中的fuzz模糊测试使用实战详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-12-12

最新评论