Go学习笔记—定时器、打点器

1、定时器

定时器timer的功能是让一段Go代码在指定的时间段后运行一次。

// The Timer type represents a single event.
// When the Timer expires, the current time will be sent on C,
// unless the Timer was created by AfterFunc.
// A Timer must be created with NewTimer or AfterFunc.
type Timer struct {C <-chan Timer runtimeTimer
}
  • 定时器类型表示单个事件。
  • 定时器过期时,会通过通道C返回当前时间,除非定时器由AfterFunc创建。
  • 必须使用NewTimer或者AfterFunc创建定时器

NewTimer创建一个定时器,该定时器会在至少一个持续时间后在通道上发送当前时间。

使用方法如下:

timer := time.NewTimer(time.Second * 4)
//用变量接收一个传入时间值的方法产生的对象

源码如下:

// NewTimer creates a new Timer that will send
// the current time on its channel after at least duration d.
func NewTimer(d Duration) *Timer {c := make(chan Time, 1)t := &Timer{C: c,r: runtimeTimer{when: when(d),f:    sendTime,arg:  c,},}startTimer(&t.r)return t
}

AfterFunc等待持续时间结束,然后在自己的goroutine中调用ff返回一个定时器,可使用Stop()方法取消调用。

// AfterFunc waits for the duration to elapse and then calls f
// in its own goroutine. It returns a Timer that can
// be used to cancel the call using its Stop method.
func AfterFunc(d Duration, f func()) *Timer {t := &Timer{r: runtimeTimer{when: when(d),f:    goFunc,arg:  f,},}startTimer(&t.r)return t
}//f 是一个函数类型,调用时传入goFunc
func goFunc(arg interface{}, seq uintptr) {go arg.(func())()
}

一个定时器,指在持续一段时间后某一时刻的独立事件。会通过一个通道进行感知。在通道接收到失效信息之前,会一直处于阻塞状态。

func main(){timer1 := time.NewTimer(time.Second * 4) //创建一个4秒后失效的定时器<- timer1.C //用于感知的通道fmt.Println("Timer 1 expired") //输出提示信息
}//控制台四秒后输出信息
//Timer 1 expired

区别于使用time.Sleep来等待事件的发生,定时器在失效之前可以取消。

func main(){timer2 := time.NewTimer(time.Second * 4)go func(){<-timer2.Cfmt.Println("Timer 2 expired")}()stop2 := time2.Stop()if stop2 {fmt.Println("Timer 2 stopped")}
}//控制台立即输出
//Timer 2 stopped

此例中,如果没有使用协程来控制timer2接收失效信息,控制台会等待4秒输出Timer 2 expired

2、打点器

打点器ticker是程序在固定的时间间隔内重复执行,直到停止。

// A Ticker holds a channel that delivers ``ticks'' of a clock
// at intervals.
type Ticker struct {C <-chan Time // The channel on which the ticks are delivered.r runtimeTimer
}

NewTicker创建一个打点器,它将定时执行。NewTicker使用方法如下:

ticker := time.NewTicker(time.Second * 1)
//用变量接收一个传入时间值的方法产生的对象

源码如下:

// NewTicker returns a new Ticker containing a channel that will send
// the time on the channel after each tick. The period of the ticks is
// specified by the duration argument. The ticker will adjust the time
// interval or drop ticks to make up for slow receivers.
// The duration d must be greater than zero; if not, NewTicker will
// panic. Stop the ticker to release associated resources.
func NewTicker(d Duration) *Ticker {if d <= 0 {panic(errors.New("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{C: c,r: runtimeTimer{when:   when(d),period: int64(d),f:      sendTime,arg:    c,},}startTimer(&t.r)return t
}
  • NewTicker返回一个打点器,包含一个发送每次打点的时间的通道。
  • 打点时间由生成ticker传入的参数决定。
  • 打点器会调整时间或下降打点次数,来弥补接受速度慢的问题。
  • 接收的时间参数必须大于0,否则会返回错误信息。
  • 使用完毕,要关闭打点器ticker以节约资源。

创建一个对象在,间隔1秒进行一次打点操作,返回打点时间。

func main(){ticker := time.NewTicker(time.Second * 1)go func(){for t := range ticker.C{  //从通道中获取时间值fmt.Println("Tick at",t)}}()time.Sleep(time.second * 3) //模拟函数程序时间ticker.Stop()fmt.Println("Ticker stopped")
}//每间隔一秒,输出一条结果
//Tick at 2021-08-16 15:47:48.9317032 +0800 CST m=+1.002859901
//Tick at 2021-08-16 15:47:49.9427927 +0800 CST m=+2.013949401
//Ticker stopped

Go学习笔记—定时器、打点器相关推荐

  1. [转载] Python学习笔记——用装饰器decorator和Memoization记忆化提高效率,原理讲清楚了

    参考链接: 在Python中使用装饰器进行记忆 Python学习笔记--用装饰器decorator和Memoization记忆化提高效率 装饰器Memoization记忆化运用`functools`中 ...

  2. muduo网络库学习笔记(五) 链接器Connector与监听器Acceptor

    目录 muduo网络库学习笔记(五) 链接器Connector与监听器Acceptor Connector 系统函数connect 处理非阻塞connect的步骤: Connetor时序图 Accep ...

  3. OpenGL超级宝典学习笔记:着色器存储区块、原子内存操作、内存屏障

    前言 本篇在讲什么 本篇为蓝宝书学习笔记 着色器存储区块 原子内存操作 内存屏障 本篇适合什么 适合初学Open的小白 本篇需要什么 对 C++语法有简单认知 对 OpenGL有简单认知 最好是有 O ...

  4. 【音乐App】—— Vue-music 项目学习笔记:播放器内置组件开发(一)

    前言:以下内容均为学习慕课网高级实战课程的实践爬坑笔记. 项目github地址:https://github.com/66Web/ljq_vue_music,欢迎Star. 播放暂停 前进后退 一.播 ...

  5. STM32单片机入门学习笔记——定时器TIM第一部分

    笔记整理自B站UP主江科大自化协教程<STM32入门教程-2023持续更新中>,所用单片机也为教程推荐单片机. 大致内容 第一部分:定时器基本定时的功能,定时器每隔这个时间产生一个中断,来 ...

  6. STM32单片机入门学习笔记——定时器TIM第三部分

    笔记整理自B站UP主江科大自化协教程<STM32入门教程-2023持续更新中>,所用单片机也为教程推荐单片机. 大致内容 第一部分:定时器基本定时的功能,定时器每隔这个时间产生一个中断,来 ...

  7. 《深入理解java虚拟机》学习笔记四/垃圾收集器GC学习/一

    Grabage Collection      GC GC要完毕的三件事情: 哪些内存须要回收? 什么时候回收? 怎样回收? 内存运行时区域的各个部分中: 程序计数器.虚拟机栈.本地方法栈这3个区域随 ...

  8. python学习笔记(装饰器、迭代器生成器、内置函数、软件目录开发规范)

    装饰器 定义:本质是函数,(功能:装饰其他函数):就是为其他函数添加附加功能 模拟场景一,在现有的函数中增加某个功能.现有的做法是定义新函数,并且加入函数中.需要修改源代码. def logger() ...

  9. Python学习笔记:装饰器

    前言 最近在学习深度学习,已经跑出了几个模型,但Pyhton的基础不够扎实,因此,开始补习Python了,大家都推荐廖雪峰的课程,因此,开始了学习,但光学有没有用,还要和大家讨论一下,因此,写下这些帖 ...

  10. 深度学习笔记--多层感知器以及BP算法

    简介 多层感知器,是指包含1个或多个隐层的前馈神经网络. 前馈神经网络的特点: 第0层为输入层,最后一层为输出层,中间层为隐层. 整个网络无反馈,信号从输入层向输出层单向传播,整个网络为有向无环图. ...

最新文章

  1. 基于python的数据分析方法五种_利用Python进行数据分析 第5章 pandas入门(1)
  2. apache httpd服务器403 forbidden的问题
  3. jFreeChary初探
  4. c语言怎么输出线性表里元素,C语言的世界-线性表
  5. 1042. 字符统计(20)
  6. 小米登录协议分析_性能测试篇之Loadrunner与ida工具结合完成java vuser协议的脚本...
  7. checkbox wpf 改变框的大小_【论文阅读】倾斜目标范围框(标注)的终极方案
  8. java代码生成器 快速开发平台 二次开发 外包项目利器 springmvc SSM后台框架源码...
  9. HelloWorld讲解
  10. 安装Visual studio 2013并进行单元测试
  11. HttpRequest Get和Post调用其他页面的方法
  12. dell2100服务器组装,戴尔poweredge r730服务器配置及系统安装详解教程
  13. NetDevOps常用数据库python实战-influxDB_grafana
  14. PHP curl get post 请求的封装
  15. 记一次在广州看牙医经历
  16. Java JDK 动态代理(AOP)使用及实现原理分析
  17. 八皇后问题python_八皇后问题 Python实现
  18. Python注释符号(多行注释和单行注释)用法详解
  19. 关于JavaScript的Object所有方法
  20. 【alibaba cloud】在macM1上用docker部署nacos集群

热门文章

  1. 移动端和网页端公告栏文字右向左轮播滑动
  2. 刷题总结——寻宝游戏(bzoj3991 dfs序)
  3. Windbg的获取与安装教程
  4. 扫雷小游戏 纯C语言/C++开发分享成果和记录
  5. 基于php+mysql的学员量化考评系统
  6. 《统计学习方法》课后习题参考答案
  7. 从JDBC规范谈桥接模式
  8. 无法找到 :import javax.annotation.Resource-------Resource 这个注解
  9. OpenCV 银行卡卡号识别
  10. python逐行读取xls文件