定时器

在time包中有两个函数可以帮助我们初始化time.Timer

time.Newtimer函数
初始化一个到期时间据此时的间隔为3小时30分的定时器

t := time.Newtimer(3*time.Hour + 30*time.Minute)

注意,这里的变量t是*time.NewTimer类型的,这个指针类型的方法集合包含两个方法

  • Rest
    用于重置定时器
    该方法返回一个bool类型的值
  • Stop
    用来停止定时器
    该方法返回一个bool类型的值,如果返回false,说明该定时器在之前已经到期或者已经被停止了,反之返回true。

通过定时器的字段C,我们可以及时得知定时器到期的这个事件来临,C是一个chan time.Time类型的缓冲通道,一旦触及到期时间,定时器就会向自己的C字段发送一个time.Time类型的元素值

示例一:一个简单定时器

package mainimport ("fmt""time"
)func main(){//初始化定时器t := time.NewTimer(2 * time.Second)//当前时间now := time.Now()fmt.Printf("Now time : %v.\n", now)expire := <- t.Cfmt.Printf("Expiration time: %v.\n", expire)
}
Now time : 2015-10-31 01:19:07.210771347 +0800 CST.
Expiration time: 2015-10-31 01:19:09.215489592 +0800 CST.

示例二:我们在改造下之前的那个简单超时操作

package mainimport ("fmt""time"
)
func main(){//初始化通道ch11 := make(chan int, 1000)sign := make(chan byte, 1)//给ch11通道写入数据for i := 0; i < 1000; i++ {ch11 <- i}//单独起一个Goroutine执行selectgo func(){var e intok := true//首先声明一个*time.Timer类型的值,然后在相关case之后声明的匿名函数中尽可能的复用它var timer *time.Timerfor{select {case e = <- ch11:fmt.Printf("ch11 -> %d\n",e)case <- func() <-chan time.Time {if timer == nil{//初始化到期时间据此间隔1ms的定时器timer = time.NewTimer(time.Millisecond)}else {//复用,通过Reset方法重置定时器timer.Reset(time.Millisecond)}//得知定时器到期事件来临时,返回结果return timer.C}():fmt.Println("Timeout.")ok = falsebreak}//终止for循环if !ok {sign <- 0break}}}()//惯用手法,读取sign通道数据,为了等待select的Goroutine执行。<- sign
}

time.After函数
time.After函数, 表示多少时间之后,但是在取出channel内容之前不阻塞,后续程序可以继续执行

鉴于After特性,其通常用来处理程序超时问题

package mainimport ("fmt""time"
)func main(){ch1 := make(chan int, 1)ch2 := make(chan int, 1)select {case e1 := <-ch1://如果ch1通道成功读取数据,则执行该case处理语句fmt.Printf("1th case is selected. e1=%v",e1)case e2 := <-ch2://如果ch2通道成功读取数据,则执行该case处理语句fmt.Printf("2th case is selected. e2=%v",e2)case <- time.After(2 * time.Second):fmt.Println("Timed out")}
}

time.Sleep函数
表示休眠多少时间,休眠时处于阻塞状态,后续程序无法执行.

time.Afterfunc函数
示例三:自定义定时器

package mainimport ("fmt""time"
)
func main(){var t *time.Timerf := func(){fmt.Printf("Expiration time : %v.\n", time.Now())fmt.Printf("C`s len: %d\n", len(t.C))}t = time.AfterFunc(1*time.Second, f)//让当前Goroutine 睡眠2s,确保大于内容的完整//这样做原因是,time.AfterFunc的调用不会被阻塞。它会以一部的方式在到期事件来临执行我们自定义函数f。time.Sleep(2 * time.Second)
}
Expiration time : 2015-10-31 01:04:42.579988801 +0800 CST.
C`s len: 0

第二行打印内容说明:定时器的字段C并没有缓冲任何元素值。这也说明了,在给定了自定义函数后,默认的处理方法(向C发送代表绝对到期时间的元素值)就不会被执行了。

断续器

结构体类型time.Ticker表示了断续器的静态结构。
就是周期性的传达到期时间的装置。这种装置的行为方式与仅有秒针的钟表有些类似,只不过间隔时间可以不是1s。
初始化一个断续器

var ticker *timeTicker = time.NewTicker(time.Second)
示例一:使用时间控制停止ticke
package mainimport ("fmt""time"
)func main(){//初始化断续器,间隔2svar ticker *time.Ticker = time.NewTicker(1 * time.Second)go func() {for t := range ticker.C {fmt.Println("Tick at", t)}}()time.Sleep(time.Second * 5)   //阻塞,则执行次数为sleep的休眠时间/ticker的时间ticker.Stop()     fmt.Println("Ticker stopped")
}
Tick at 2015-10-31 01:29:34.41859284 +0800 CST
Tick at 2015-10-31 01:29:35.420131668 +0800 CST
Tick at 2015-10-31 01:29:36.420565647 +0800 CST
Tick at 2015-10-31 01:29:37.421038416 +0800 CST
Tick at 2015-10-31 01:29:38.41944582 +0800 CST
Ticker stopped

示例二:使用channel控制停止ticker

package mainimport ("fmt""time"
)func main(){//初始化断续器,间隔2svar ticker *time.Ticker = time.NewTicker(100 * time.Millisecond)//num为指定的执行次数num := 2c := make(chan int, num) go func() {for t := range ticker.C {c <- 1fmt.Println("Tick at", t)}}()time.Sleep(time.Millisecond * 1500)ticker.Stop()     fmt.Println("Ticker stopped")
}

go time包定时器和断续器相关推荐

  1. Go 定时器和断续器

    1.定时器 Go语言中定时器可以实现在指定时间点执行特定的事件,定时器的实质是单向通道,time.Timer结构体类型中有一个time.Time类型的单向chan,具体声明如下: type Timer ...

  2. go - time包的定时器/断续器

    from: https://www.kancloud.cn/digest/batu-go/153534 定时器 在time包中有两个函数可以帮助我们初始化time.Timer time.Newtime ...

  3. Golang停止ticker断续器

    1.原代码如下 package mainimport ("fmt""time" )func main() {intchan := make(chan int,1 ...

  4. golang并发编程-04-通道-02-定时器、断续器

    文章目录 1. 定时器 1.1 time.NewTimer 1.2 <-time.After() 1.3 停止 1.4 定时器重置 2 断续器 2.1 断续器使用 2.2 断续器中断 1. 定时 ...

  5. 【JavaScript】- 打地鼠游戏(定时器嵌套延时器)

    这里使用了定时器嵌套延时器的方法 js: window.addEventListener('load', () => {// 获取元素let start = document.querySele ...

  6. 介绍 Go 断续器(Tickers)

    介绍 Go 断续器(Tickers) 本文我们介绍 Go 断续器(Tickers)以及如何在应用中有效使用断续器.当我们需要在特定时间间隔内周期性重复执行动作,我们可以使用断续器.与协程一起使用可以实 ...

  7. 中国真空断续器市场现状研究分析与发展前景预测报告(2022)

    [报告篇幅]:109 [报告图表数]:150 [报告出版时间]:2021年12月 报告摘要 2021年中国真空断续器市场销售收入达到了 万元,预计2028年可以达到 万元,2022-2028期间年复合 ...

  8. JavaScript学习笔记 06、DOM元素—③定时器与延时器

    文章目录 前言 一.定时器(√) 1.1.介绍定时器与清除定时器方法(含案例) 1.2.解决按钮点击时设置定时器setInterval()的小问题 1.3.实际案例(设置与删除定时器) 二.延时器(√ ...

  9. 29【定时器和延时器】

    定时器和延时器 1.定时器 1.1 基本介绍 setInterval() 函数可以重复调用一个函数,在每次调用之间有固定的时间间隔. Interval:间隔 <!DOCTYPE html> ...

最新文章

  1. 蓝桥杯第九届决赛-交换次数-java
  2. 2021年春季学期-信号与系统-第八次作业参考答案-第三小题
  3. 去除警告,打电话,发信息,应用程序之间跳转,打印沙盒路径,字符串名字转换方法,包装导航控制器等的代码...
  4. 19、Fragment
  5. outlook邮箱邮件内容乱码_VBA:Outlook和Excel综合运用
  6. 关于DHCP的中继问题
  7. 【财务预警】基于matlab BP神经网络财务预警【含Matlab源码 494期】
  8. abaqus·复合材料建模技术与应用
  9. java程序员转正述职报告PPT
  10. 删掉启动分区进不了系统,复活办法(win10)
  11. 利用python脚本监控Tomcat服务器
  12. [质因数分解]樱花 洛谷P1445
  13. 热成像进入AI人工智能时代!精准人脸识别体温计,实名制测量体温
  14. apex Error : Given no hashes to check 137 links for project 'pip': discarding no candidates
  15. php常见错误,php常见错误及错误处理 - 小俊学习网
  16. C# 导出Excel文件 打开Excel文件格式与扩展名指定格式不一致。
  17. SONY的IMX500浅谈
  18. 真题训练1-算法思维训练
  19. 现代计算机技术是什么,现代教育中计算机技术的应用分析
  20. 移动手机卡支持NFC支付 小米2A刷地铁体验

热门文章

  1. 微信大转盘 【案例源码】提供
  2. 天津大学大作业管理概论答案
  3. Python+pyqt+dicom+vtk 使用pyinstaller打包软件时正常,运行报错vtkmodules.all、pydicom.encoders.pylibjpeg等错误
  4. 服务器容器化-docker(全)
  5. 数据结构--图的存储结构
  6. IOS 隐私政策网址 URL MG
  7. 软件确认测试和验收测试有什么区别?
  8. 【vultr使用流程笔记】
  9. 亚马逊测评做单总是被砍单封号是什么原因?
  10. CodeForces - 777D Cloud of Hashtags