返回顶部
首页 > 资讯 > 后端开发 > GO >Golang 定时器的终止与重置实现
  • 655
分享到

Golang 定时器的终止与重置实现

2024-04-02 19:04:59 655人浏览 安东尼
摘要

昨日有读者对定时器的终止有疑问,今天我们来聊一聊定时器的终止与重置吧! 定时器是一种通过设置一项任务,在未来的某个时刻执行该任务的机制。 定时器的种类通常只有两种,一种是只执行一次

昨日有读者对定时器的终止有疑问,今天我们来聊一聊定时器的终止与重置吧!

定时器是一种通过设置一项任务,在未来的某个时刻执行该任务的机制。

定时器的种类通常只有两种,一种是只执行一次的延时模式,一种是每隔一段时间执行一次的间隔模式。

在现代编程语言中,定时器几乎是标配。除了设置定时器外,还需要有提供定时器的方法。

比如在 javascript 中,提供了 setTimeout、setInterval、clearTimeout 和 clearInterval 四个 api,相比较而言是比较简单的。Go 语言中定时器的 API 就比较完善,所有的 API 都在 time 包中。

先看下面一段代码:


func main() {
    timer := time.NewTimer(3 * time.Second)
    fmt.Println(time.Now(),"炸弹将于3秒后引爆")
​
​
    timer.Stop()
    fmt.Println("定时炸弹已拆除,定时器失效")
​
    
    t := <-timer.C
    fmt.Println("炸弹引爆于",t)
}

先来看看运行结果

2021-08-25 10:08:34.706412 +0800 CST m=+0.023017601 炸弹将于3秒后引爆
定时炸弹已拆除,定时器失效
fatal error: all goroutines are asleep - deadlock!

我们可以趁定时器时间未到而使用Stop来将定时器终止,如果定时器已被叫停,其时间管道永远读不出数据了,如果强制读取,就会出现死。因为使用Stop就是停止往管道里面写数据了,或者可以这样说,就是管道里面的数据已经读完了,使用time.NewTimer(3 * time.Second)就是往管道里面写数据。

我们在来看一个有趣的例子。


func main()  {
    timer := time.NewTimer(1 * time.Second)
    fmt.Println(time.Now())
​
    time.Sleep(2 * time.Second)
    fmt.Println(time.Now())
​
    timer.Reset(10*time.Second)
    fmt.Println("炸弹引爆于",<-timer.C)
}

现在,思考一下,炸弹是什么时候引爆的!

想知道答案吗?不要着急,不要着急,休息,休息一会儿,答案马上揭晓

我们来看看运行结果吧:

2021-08-25 10:15:16.8406335 +0800 CST m=+0.014999801
2021-08-25 10:15:18.906213 +0800 CST m=+2.080579301
炸弹引爆于 2021-08-25 10:15:17.8522233 +0800 CST m=+1.026589601

是不是和你想的一样?如果不是,没关系,听我细细道来。
因为time.sleep()是让主协程睡大觉,而timer.C读的那条管道的协程是独立的。所以你让主协程睡大觉并不会影响定时器的计时,就相当于一个定时炸弹要引爆了,你马上把手表的时间往后调,但是定时炸弹上的数字时间不会因为手表上的时间往后调而往后调。

诶!这时你会说我不是重置了吗?
但是定时器超时了,那么重置就不起作用了,你想一想,定时炸弹都爆炸了,你去重置还有效吗?
如果我们将定时器的时间调到3秒,就是这样:


timer := time.NewTimer(3 * time.Second)

那么输出结果会怎样?

2021-08-25 10:26:21.1299417 +0800 CST m=+0.020983301
2021-08-25 10:26:23.2191128 +0800 CST m=+2.110154401
炸弹引爆于 2021-08-25 10:26:33.227692 +0800 CST m=+12.118733601

设置定时器后2秒,主协程才执行到Reset(),所以炸弹是在设置定时器12秒后才爆炸的。
有趣的是,当我查看Reset()的源码时,发现了这样一段注释:


// Reset should be invoked only on stopped or expired timers with drained channels.
// If a program has already received a value from t.C, the timer is known
// to have expired and the channel drained, so t.Reset can be used directly.
// If a program has not yet received a value from t.C, however,
// the timer must be stopped and—if Stop reports that the timer expired
// before being stopped—the channel explicitly drained:
//
//  if !t.Stop() {
//      <-t.C
//  }
//  t.Reset(d)

根据我的理解,大意是这样的,如果计时器已经过期,并且t.C已经被读完了,那么可以直接使用Reset。而如果程序Reset之前未从t.C中读取过值的话,就需要调用Stop来结束定时器,才能使用reset。

到此这篇关于golang 定时器的终止与重置实现的文章就介绍到这了,更多相关Golang 定时器终止与重置内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

您可能感兴趣的文档:

--结束END--

本文标题: Golang 定时器的终止与重置实现

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

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

猜你喜欢
  • Golang 定时器的终止与重置实现
    昨日有读者对定时器的终止有疑问,今天我们来聊一聊定时器的终止与重置吧! 定时器是一种通过设置一项任务,在未来的某个时刻执行该任务的机制。 定时器的种类通常只有两种,一种是只执行一次...
    99+
    2024-04-02
  • Android定时器Timer的停止和重启实现代码
    本文介绍了Android定时器Timer的停止和重启实现代码,分享给大家,具体如下:7月份做了一个项目,利用自定义控件呈现一幅动画,当时使用定时器来控制时间,但是当停止开启时总是出现问题。一直在寻找合理的方法解决这个问题,一直没有找到,最近...
    99+
    2023-05-30
    重启 android 定时器
  • 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定时器
  • JS的闭包与定时器这么实现
    这篇文章主要讲解了“JS的闭包与定时器这么实现”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“JS的闭包与定时器这么实现”吧!   什么是闭包有什么作用 ...
    99+
    2024-04-02
  • Qt实现线程与定时器的方法
    目录一、定时器QTimer类二、在多线程中使用QTimer1.错误用法2.正确用法一3.正确用法二一、定时器QTimer类 The QTimer class provides rep...
    99+
    2024-04-02
  • golang 墙上时钟与单调时钟的实现
    目录墙上时钟与单调时钟墙上时钟单调时钟Time的结构Since的实现小结参考资料墙上时钟与单调时钟 墙上时钟 墙上时钟也称为墙上时间。大多是1970年1月1日(UTC)以来的秒数和毫...
    99+
    2024-04-02
  • Java线程生命周期的终止与复位怎么实现
    这篇文章主要介绍“Java线程生命周期的终止与复位怎么实现”,在日常操作中,相信很多人在Java线程生命周期的终止与复位怎么实现问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java线程生命周期的终止与复位怎...
    99+
    2023-07-02
  • Java如何实现存储与重定向同时进行?
    在Java编程中,我们经常需要将程序的输出结果存储到文件中,或者将输入重定向到文件中。这两个操作都是非常常见的,但是如何同时进行这两个操作呢?在这篇文章中,我们将介绍Java如何实现存储与重定向同时进行。 一、Java中的重定向 在Jav...
    99+
    2023-06-01
    存储 重定向 二维码
  • SpringBoot定时任务调度与爬虫的配置实现
    SpringTask SpringTask是Spring自主研发的轻量级定时任务工具,相比于Quartz更加简单方便,且不需要引入其他依赖即可使用。 SpringTask的配置 在配...
    99+
    2024-04-02
  • golang定时器Timer的用法和实现原理解析
    目录一文搞懂golang定时器Timer的用法和实现原理前言Timertimer结构体创建定时器停止定时器重置定时器实现原理数据结构runtimeTimer创建Timer停止Time...
    99+
    2023-05-15
    golang定时器 golang定时器Ticker
  • 【JavaEE初阶】 定时器详解与实现
    文章目录 🌴定时器是什么🎋Java标准库中的定时器🌲模拟实现定时器🚩定时器的构成📌第一步:MyStack类的建立...
    99+
    2023-10-26
    java-ee java 开发语言 多线程 计算机操作系统 定时器
  • golang WebSocket与浏览器的集成:实现即时通信
    Golang是一种高效、简单、易于学习的编程语言,而WebSocket是实现即时通信的重要技术。本文将介绍如何在Golang中集成WebSocket,并实现与浏览器的即时通信功能。1. 引言在Web应用开发中,实时通信是一种非常重要的功能要...
    99+
    2023-12-17
    Golang websocket 即时通信
  • golang定时器Timer的用法和实现原理是什么
    本篇内容介绍了“golang定时器Timer的用法和实现原理是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!TimerTimer是一种单...
    99+
    2023-07-06
  • Golang实现CronJob(定时任务)的方法详解
    目录引言类库介绍扩展性强主流程类库改造打印任务列表信息根据名称移除脚本改造效果引言 最近做了一个需求,是定时任务相关的。以前定时任务都是通过 linux crontab 去实现的,现...
    99+
    2023-05-14
    Golang实现定时任务 Golang定时任务 Golang CronJob
  • Java中的实时重定向缓存:如何实现?
    在Java应用程序中,实时重定向缓存是一个非常重要的功能。它可以帮助我们捕获应用程序输出并将其重定向到我们选择的目标,例如文件或控制台。这在调试和排错方面非常有用,因为我们可以方便地查看应用程序的输出。 那么,Java中的实时重定向缓存是...
    99+
    2023-06-22
    重定向 实时 缓存
  • Python 实现定积分与二重定积分的操作
    1.概述 最近项目需要使用程序实现数学微积分,最初想用java实现,后来发现可用文档太少,实现比较麻烦,后来尝试使用python实现,代码量较少,主要有sympy与scipy两种实现方式,本文主要记录scipy的实现...
    99+
    2022-06-02
    Python 定积分 二重定积分
  • vbs怎么实现的定时关机或重启
    这篇文章主要讲解了“vbs怎么实现的定时关机或重启”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“vbs怎么实现的定时关机或重启”吧!代码如下:'定时关机或重启的脚本,在windows...
    99+
    2023-06-08
  • Golang与FFmpeg: 实现网络视频实时录制的技术实现
    要实现网络视频的实时录制,可以使用Golang和FFmpeg的组合来完成。下面是一种可能的技术实现方案:1. 使用Golang编写一...
    99+
    2023-10-08
    Golang
  • Java中的实时缓存和重定向:如何实现?
    在当今互联网时代,实时缓存和重定向已经成为了开发中的必备技能。Java作为一门开发语言,也提供了丰富的API和库来支持这些特性。本文将介绍Java中实现实时缓存和重定向的方法,并通过演示代码来展示如何实现。 一、实时缓存 实时缓存是指将数...
    99+
    2023-06-22
    重定向 实时 缓存
  • Golang与FFmpeg: 实现实时视频流分析的技术
    Golang和FFmpeg都是用于处理多媒体数据的强大工具。下面是一些使用Golang和FFmpeg实现实时视频流分析的技术。1. ...
    99+
    2023-10-08
    Golang
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作