gpt4 book ai didi

Go的固定时长定时器和周期性时长定时器

转载 作者:qq735679552 更新时间:2022-09-29 22:32:09 27 4
gpt4 key购买 nike

CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.

这篇CFSDN的博客文章Go的固定时长定时器和周期性时长定时器由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.

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

先来看看下面这段代码:

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

运行结果是这样的:

定时器创建完毕! 2021-08-24 14:02:28.6664158 +0800 CST m=+0.012997601 2021-08-24 14:02:31.670071 +0800 CST m=+3.016652801 。

我们可以看到,运行结果和我们要达到的目的基本一致,三秒的定时器创建完毕后,阻塞三秒后才能读出时间.

我们来看看这个 。

?
1
x := <- timer.C

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

?
1
2
3
4
type Timer struct {
     C <-chan Time
     r runtimeTimer
}

如果要描述一个单向的只写的管道,应该这样写:

?
1
C chan <- Time

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

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

使用time.After()等待规定的一段时间,然后就在返回的管道上发送当前时间。它相当于 NewTimer(d).C。垃圾收集器不会回收底层的 Timer,直到计时器触发才回收。 如果需要考虑效率,请改用 NewTimer 并在不再需要计时器时调用 Timer.Stop来结束.

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

?
1
x := <- time.NewTimer(3 * time.Second).C

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

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

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

如果将定时器结束后,你仍然要坚持读,就会出现下面这种情况! 。

fatal error: all goroutines are asleep - deadlock.

出现死锁!所以这里需要用到break. 。

到此这篇关于谈谈Go的固定时长定时器和周期性时长定时器的文章就介绍到这了,更多相关Go 定时器 内容请搜索我以前的文章或继续浏览下面的相关文章希望大家以后多多支持我! 。

原文链接:https://juejin.cn/post/6999881436941516836 。

最后此篇关于Go的固定时长定时器和周期性时长定时器的文章就讲到这里了,如果你想了解更多关于Go的固定时长定时器和周期性时长定时器的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com