请选择 进入手机版 | 继续访问电脑版

[Golang] Go的固定时长定时器和周期性时长定时器

[复制链接]
查看159 | 回复20 | 2021-9-15 02:11:04 | 显示全部楼层 |阅读模式

我们之前要想在调度内里 实现延时实行 ,我们可以使用 管道壅闭 ,直到有人往管道内里 写东西才变通畅,还可以使用 sleep来睡觉,但是睡觉的过程,协程啥也干不了也占用资源。以是 我们要用到接下来讲的定时器,不会像sleep那样睡的时间 也占用资源。

先来看看下面这段代码:

  1. package main
  2. import (
  3. "fmt"
  4. "time"
  5. )
  6. func main() {
  7. timer := time.NewTimer(3 * time.Second)
  8. fmt.Println("定时器创建完毕!")
  9. fmt.Println(time.Now())
  10. //阻塞3秒后才能读出时间
  11. x := <- timer.C
  12. //这个C是一个单向的只读管道
  13. fmt.Println(x)
  14. }
复制代码

运行效果 是如许 的:

  1. 定时器创建完毕!
  2. 2021-08-24 14:02:28.6664158 +0800 CST m=+0.012997601
  3. 2021-08-24 14:02:31.670071 +0800 CST m=+3.016652801
复制代码

我们可以看到,运行效果 和我们要达到的目的 基本划一 ,三秒的定时器创建完毕后,壅闭 三秒后才能读出时间。

我们来看看这个

  1. x := <- timer.C
复制代码

根据下面这段代码可知,这个C是一个单向的只读管道:

  1. type Timer struct {
  2. C <-chan Time
  3. r runtimeTimer
  4. }
复制代码

假如 要形貌 一个单向的只写的管道,应该如许 写:

  1. C chan <- Time
复制代码

但是假如 要达到同样的目的 ,我们可以使用 下面这种更简单的方式:

  1. func main() {
  2. fmt.Println(time.Now())
  3. x := <- time.After(3*time.Second)
  4. fmt.Println(x)
  5. }
复制代码

使用 time.After()等待规定的一段时间,然后就在返回的管道上发送当前时间。它相当 于 NewTimer(d).C。垃圾网络 器不会回收底层的 Timer,直到计时器触发才回收。 假如 必要 思量 服从 ,请改用 NewTimer 并在不再必要 计时器时调用 Timer.Stop来竣事 。

当然我们也可以使用 下面这种方法,两种方法都可以:

  1. x := <- time.NewTimer(3 * time.Second).C
复制代码

刚才固定时长定时器的就是一个定时炸弹设置为三秒钟那三秒钟之后就爆炸,现在 我们看看周期性时长定时器吧!

  1. func main() {
  2. ticker := time.NewTicker(1 * time.Second)
  3. var i int
  4. for{
  5. x := <- ticker.C
  6. fmt.Print("\r",x)
  7. i++
  8. if i>3{
  9. //停掉秒表会导致ticker.C永远无法读出数据,
  10. //一定要读会导致死锁.
  11. ticker.Stop()
  12. break
  13. }
  14. }
  15. fmt.Println("计时结束")
  16. }
复制代码

这段代码的意思是,设置一个周期性时长定时器,然后每一秒从管道内读一次数据,然后输出直到i>3,就使用 ticker.Stop()将定时器竣事 ,然后克制 循环,然后告诉你计时竣事 。

假如 将定时器竣事 后,你仍然 要坚持读,就会出现下面这种环境 !

  1. fatal error: all goroutines are asleep - deadlock!
复制代码

出现死锁!以是 这里必要 用到break.

到此这篇关于谈谈Go的固定时长定时器和周期性时长定时器的文章就先容 到这了,更多干系 Go 定时器 内容请搜刮 脚本之家从前 的文章或继续欣赏 下面的干系 文章盼望 大家以后多多支持脚本之家!


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

avatar 岳兄弟散养家鸡 | 2021-9-25 09:49:28 | 显示全部楼层
以后要跟admin楼主好好学习学习!
回复

使用道具 举报

avatar 123456809 | 2021-9-29 12:45:50 | 显示全部楼层
admin楼主就是我的榜样哦
回复

使用道具 举报

avatar 123457108 | 2021-10-1 22:16:24 | 显示全部楼层
楼上是GG还是MM啊?
回复

使用道具 举报

avatar 直子的爱本 | 2021-10-7 09:50:35 | 显示全部楼层
大神就是大神,这么经典!
回复

使用道具 举报

avatar 鹤翎商贸 | 2021-10-9 10:06:36 | 显示全部楼层
帖子很有深度!
回复

使用道具 举报

avatar 木头哈喇子崭 | 2021-10-9 11:55:58 | 显示全部楼层
admin楼主的头像能辟邪啊!
回复

使用道具 举报

avatar 丽人至上再 | 2021-10-16 01:25:55 | 显示全部楼层
楼上的很有激情啊!
回复

使用道具 举报

avatar 水草香蕉壁 | 2021-10-17 03:59:03 | 显示全部楼层
好多兽医在广场上义诊,admin楼主去看看吧!
回复

使用道具 举报

很经典,收藏了!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则