iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > GO >golang定时器Timer的用法和实现原理是什么
  • 164
分享到

golang定时器Timer的用法和实现原理是什么

2023-07-06 01:07:25 164人浏览 独家记忆
摘要

本篇内容介绍了“golang定时器Timer的用法和实现原理是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!TimerTimer是一种单

本篇内容介绍了“golang定时器Timer的用法和实现原理是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

    Timer

    Timer是一种单一事件的定时器,即经过指定的时间后触发一个事件,因为Timer只执行一次就结束,所以称为单一事件,这个事件通过其本身提供的channel进行通知触发。

    timer结构体

    通过src/time.sleep.Go:Timer定义了Timer数据结构:

    // Timer代表一次定时,时间到达后仅执行一个事件。type Timer struct {    C <-chan Time    r runtimeTimer}

    它提供了一个channel,在定时时间到达之前,没有数据写入timer.C会一直阻塞,直到时间到达,向channel写入系统时间,阻塞解除,可以从中读取数据,这就是一个事件。

    创建定时器
    func NewTimer(d Duration) *Timer

    通过上面方法指定一个事件即可创建一个Timer,Timer一经创建便开始计时,不需要额外的启动命令。

    示例:

    func main()  {timer := time.NewTimer(time.Second * 5) //设置超时时间5s<- timer.Cfmt.Println("Time out!")}
    停止定时器

    Timer创建后可以随时停止,停止计时器的方法如下:

    func (t *Timer) Stop() bool

    其返回值代表定时器有没有超时:

    • true:定时器超时前停止,后续不会再有事件发送。

    • false:定时器超时后停止。

    示例:

    func main()  {timer := time.NewTimer(time.Second * 5) //设置超时时间5s    timer.Stop()}
    重置定时器

    已经过期的定时器或者已停止的定时器,可以通过重置动作重新激活,方法如下:

    func (t *Timer) Reset(d Duration) bool

    重置的动作本质上是先停掉定时器,再启动,其返回值也即是停掉计时器的返回值。

    func main()  {timer := time.NewTimer(time.Second * 5)<- timer.Cfmt.Println("Time out!")timer.Stop() timer.Reset(time.Second*3)  // 重置定时器}

    实现原理

    每个Go应用程序都有一个协程专门负责管理所有的Timer,这个协程负责监控Timer是否过期,过期后执行一个预定义的动作,这个动作对于Timer而言就是发送当前时间到管道中。

    数据结构
    type Timer struct {    C <-chan Time    r runtimeTimer}

    Timer只有两个成员:

    • C:channel,上层应用根据此管道接收事件;

    • r:runtimeTimer定时器,该定时器即系统管理的定时器,上层应用不可见。

    runtimeTimer

    任务的载体,用于监控定时任务,每创建一个Timer就创建一个runtimeTimer变量,然后把它交给系统进行监控,我们通过设置runtimeTimer过期后的行为来达到定时的目的。

    源码包src/time/sleep.go:runtimeTimer定义了其数据结构:

    type runtimeTimer struct {    tb uintptr                          // 存储当前定时器的数组地址    i  int                              // 存储当前定时器的数组下标    when   int64                        // 当前定时器触发时间    period int64                        // 当前定时器周期触发间隔    f      func(interface{}, uintptr)   // 定时器触发时执行的函数    arg    interface{}                  // 定时器触发时执行函数传递的参数一    seq    uintptr                      // 定时器触发时执行函数传递的参数二(该参数只在网络收发场景下使用)}
    创建Timer

    源码实现:

    func NewTimer(d Duration) *Timer {    c := make(chan Time, 1)  // 创建一个管道    t := &Timer{ // 构造Timer数据结构        C: c,               // 新创建的管道        r: runtimeTimer{            when: when(d),  // 触发时间            f:    sendTime, // 触发后执行函数sendTime            arg:  c,        // 触发后执行函数sendTime时附带的参数        },    }    startTimer(&t.r) // 此处启动定时器,只是把runtimeTimer放到系统协程的堆中,由系统协程维护    return t}
    • NewTimer()只是构造了一个Timer,然后把Timer.r通过startTimer()交给系统协程维护。

    • C 是一个带1个容量的chan,这样做有什么好处呢,原因是chan 无缓冲发送数据就会阻塞,阻塞系统协程,这显然是不行的。

    • 回调函数设置为sendTime,执行参数为channelsendTime就是到点往C 里面发送当前时间的函数

    sendTime实现:

    //c interface{} 就是NewTimer 赋值的参数,就是channelfunc sendTime(c interface{}, seq uintptr) {    select {    case c.(chan Time) <- Now(): //写不进去的话,C 已满,走default 分支    default:    }}
    停止Timer

    停止Timer,就是把Timer从系统协程中移除。函数主要实现如下:

    func (t *Timer) Stop() bool {    return stopTimer(&t.r)}

    stopTimer()即通知系统协程把该Timer移除,即不再监控。系统协程只是移除Timer并不会关闭管道,以避免用户协程读取错误。

    重置Timer

    重置Timer时会先把timer从系统协程中删除,修改新的时间后重新添加到系统协程中。

    func (t *Timer) Reset(d Duration) bool {    w := when(d)    active := stopTimer(&t.r)    t.r.when = w    startTimer(&t.r)    return active}

    补充:golang定时器Ticker

    time包下有一个Ticker结构体

    // Ticker保管一个通道,并每隔一段时间向其传递"tick"。type Ticker struct {C <-chan Time // 周期性传递时间信息的通道.r runtimeTimer}
    func NewTicker(d Duration) *Ticker{}

    NewTicker返回一个新的Ticker,该Ticker包含一个通道字段,并会每隔时间段d,就向该通道发送当时的时间。它会调整时间间隔或者丢弃tick信息以适应反应慢的接收者。如果d<=0会panic。关闭该Ticker可以释放相关资源。

    func (t *Ticker) Stop()

    Stop关闭一个Ticker。在关闭后,将不会发送更多的tick信息。Stop不会关闭通道t.C,以避免从该通道的读取不正确的成功。

    例子

    package mainimport ("fmt""time")func main() {t := time.NewTicker(5 * time.Second) //创建定时器defer t.Stop()    go sync(t)select {}}func sync(t *time.Ticker) {for {// 每5秒中从chan t.C 中读取一次<-t.Cfmt.Println("执行数据备份任务:", time.Now().FORMat("2006-01-02 15:04:05"))}}

    “golang定时器Timer的用法和实现原理是什么”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

    您可能感兴趣的文档:

    --结束END--

    本文标题: golang定时器Timer的用法和实现原理是什么

    本文链接: https://www.lsjlt.com/news/357334.html(转载时请注明来源链接)

    有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

    本篇文章演示代码以及资料文档资料下载

    下载Word文档到电脑,方便收藏和打印~

    下载Word文档
    猜你喜欢
    • golang定时器Timer的用法和实现原理是什么
      本篇内容介绍了“golang定时器Timer的用法和实现原理是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!TimerTimer是一种单...
      99+
      2023-07-06
    • golang定时器Timer的用法和实现原理解析
      目录一文搞懂golang定时器Timer的用法和实现原理前言Timertimer结构体创建定时器停止定时器重置定时器实现原理数据结构runtimeTimer创建Timer停止Time...
      99+
      2023-05-15
      golang定时器 golang定时器Ticker
    • GoLang中的timer定时器实现原理分析
      // NewTimer creates a new Timer that will send // the current time on its channel after at ...
      99+
      2023-02-02
      Go timer定时器 Go timer Go定时器
    • golang一次性定时器Timer用法及实现原理详解
      目录前言Timertimer结构体创建定时器停止定时器重置定时器实现原理数据结构runtimeTimer创建Timer停止Timer重置Timer前言 定时器在Go语言应用中使用非常...
      99+
      2024-04-02
    • linux定时器实现的原理是什么
      Linux定时器的实现原理如下:1. 内核中的定时器是通过“定时器”数据结构来表示的。该数据结构包含了定时器的到期时间、回调函数、回...
      99+
      2023-10-09
      linux
    • 怎么深入Java Timer 定时任务调度器实现原理
      这篇文章将为大家详细讲解有关怎么深入Java Timer 定时任务调度器实现原理,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。使用 Java 来调度定时任务时,我们经常会使用 Timer 类...
      99+
      2023-06-02
    • Go定时器内部的实现原理是什么
      这篇文章主要讲解了“Go定时器内部的实现原理是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Go定时器内部的实现原理是什么”吧!前言本节,我们重点关注系...
      99+
      2024-04-02
    • Java定时任务的实现原理是什么
      Java定时任务的实现原理是基于线程池和计时器的机制。在Java中,可以使用ScheduledExecutorService接口来创...
      99+
      2023-10-20
      Java
    • golang select的实现原理是什么
      在Go语言中,`select`语句用于从多个通道中接收数据,并且只有当其中一个通道可以接收数据时,`select`语句才会执行相应的...
      99+
      2023-10-27
      golang
    • golang锁的实现原理是什么
      golang锁的实现原理是通过互斥锁和读写锁来保护共享资源的访问。互斥锁是一种基本的锁机制,用于保护共享资源,使用一个标志位来表示资源是否被占用,当一个goroutine获取到互斥锁后,其他goroutine就会被阻塞,直到该gorouti...
      99+
      2023-12-12
      Golang
    • Android定时器Timer的停止和重启实现代码
      本文介绍了Android定时器Timer的停止和重启实现代码,分享给大家,具体如下:7月份做了一个项目,利用自定义控件呈现一幅动画,当时使用定时器来控制时间,但是当停止开启时总是出现问题。一直在寻找合理的方法解决这个问题,一直没有找到,最近...
      99+
      2023-05-30
      重启 android 定时器
    • JavaScript定时器原理是什么
      本篇内容介绍了“JavaScript定时器原理是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、 setTimeout() 定时器语法...
      99+
      2023-06-21
    • golang map实现原理是什么
      Golang中的map是一种哈希表数据结构,用于存储键值对。它的实现原理是使用哈希函数将键映射到哈希表中的一个桶(bucket),每...
      99+
      2023-08-15
      golang map
    • Golang中map的实现原理是什么
      这篇“Golang中map的实现原理是什么”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Golang中map的实现原理是什么...
      99+
      2023-07-05
    • 定时器的工作原理是什么
      定时器的工作原理可以分为硬件定时器和软件定时器两种类型。硬件定时器的工作原理是时钟信号源提供稳定的时钟信号作为计时器的基准。计数器从预设值开始计数,每当时钟信号到达时计数器递增。当计数器达到预设值时,定时器会触发一个中断信号通知中断控制器处...
      99+
      2023-08-16
    • Golang中 WaitGroup的实现原理是什么
      这篇文章给大家介绍Golang中 WaitGroup的实现原理是什么,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。1 前言WaitGroup是Golang应用开发过程中经常使用的并发控制技术。WaitGroup,可理解...
      99+
      2023-06-19
    • golang协程实现的原理是什么
      Golang中的协程(goroutine)是一种轻量级的线程,由Go语言的运行时系统进行管理。协程的实现原理主要包括以下几个方面: ...
      99+
      2023-10-25
      golang
    • golang协程实现原理是什么
      Golang协程实现的原理是使用了一种称为"轻量级线程"或"用户态线程"的概念,即Goroutine(协程)。在Goroutine中...
      99+
      2023-08-31
      golang
    • golang对象池的实现原理是什么
      Golang对象池是一种用于重复利用对象的机制,以避免频繁的创建和销毁对象的开销。它通过预先创建一定数量的对象,并在需要时从池中获取...
      99+
      2023-10-27
      golang
    • android定时器的工作原理是什么
      Android定时器的工作原理是通过使用Java中的Timer或者Handler类来实现的。1. Timer类:Timer类是Jav...
      99+
      2023-08-29
      android
    软考高级职称资格查询
    编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
    • 官方手机版

    • 微信公众号

    • 商务合作