Go的固定时长定时器和周期性时长定时器
作者:ReganYue 发布时间:2023-06-27 12:44:23
我们之前要想在调度里面实现延时执行,我们可以使用管道阻塞,直到有人往管道里面写东西才变通畅,还可以使用sleep来睡觉,但是睡觉的过程,协程啥也干不了也占用资源。所以我们要用到接下来讲的定时器,不会像sleep那样睡的时候也占用资源。
先来看看下面这段代码:
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
我们可以看到,运行结果和我们要达到的目的基本一致,三秒的定时器创建完毕后,阻塞三秒后才能读出时间。
我们来看看这个
x := <- timer.C
根据下面这段代码可知,这个C是一个单向的只读管道:
type Timer struct {
C <-chan Time
r runtimeTimer
}
如果要描述一个单向的只写的管道,应该这样写:
C chan <- Time
但是如果要达到同样的目的,我们可以使用下面这种更简单的方式:
func main() {
fmt.Println(time.Now())
x := <- time.After(3*time.Second)
fmt.Println(x)
}
使用time.After()等待规定的一段时间,然后就在返回的管道上发送当前时间。它相当于 NewTimer(d).C。垃圾收集器不会回收底层的 Timer,直到计时器触发才回收。 如果需要考虑效率,请改用 NewTimer 并在不再需要计时器时调用 Timer.Stop来结束。
当然我们也可以使用下面这种方法,两种方法都可以:
x := <- time.NewTimer(3 * time.Second).C
刚才固定时长定时器的就是一个定时 * 设置为三秒钟那三秒钟之后就 * ,现在我们看看周期性时长定时器吧!
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.
来源:https://juejin.cn/post/6999881436941516836
猜你喜欢
- SQL Server导出表到EXCEL文件的存储过程:*--数据导出EXCEL导出表中的数据到Excel,包含字段名,文件为真正的Excel
- 记得有一期ucdchina书友会里面,聊过一次大家的工作习惯问题,现在回想起来很有意思,特整理这篇文章分享给大家。关于photoshop1
- 如何显示随机信息?使用了asp的randomize来创造随机数,select case来显示自定义信息。具体代码如下:<html>
- 1、MySQL常用命令create database name; 创建数据库use databasename; 选择数据库drop data
- 来看看效果图对比:字符验证码: → 加法验证码:优点:①与纯字符验证码相比,本程序效防止了绝大部分(99%以上)广告机的自动识别。即使是中文
- 本文实例分析了php中Ctype函数用法。分享给大家供大家参考。具体分析如下:Ctype函数是Php的Ctype扩展函数提供了一组函数用于校
- 今天看看那些知名的Logo,可能你没注意过,它们也是一直在变化,有的还挺雷人的!先从时尚的苹果开始吧,苹果也有土的时候。1976年那第一个L
- 代码如下:'================================================== '函数名:
- 使用图层可以像素为单位精确定位页面元素,并且可以将层放置在页面的任意位置。当把页面元素放入图层之中时,还可以控制哪个显示在前面、哪个显示在后
- 原来图片自适应宽度一般都是通过Javascript来解决的,但是多少还是比较麻烦。还有一种通过设置外层容器overflow:hidden属性
- 调用很简单 Readkid.motion.tween(target,duration, vars)target: 要缓动的DOM对象dura
- 上个月,我写了一篇关于微软如何在向jQuery贡献代码的文章,也谈到了在第一批贡献的代码中的一些功能:jQuery模板和数据链接支持.今天,
- 1.简介: java.util.regex是一个用正则表达式所订制的模式来对字符串进行匹配工作的类库包。 它包括两个类:Pattern和Ma
- CSS命名规范一.文件命名规范全局样式:global.css;框架布局:layout.css;字体样式:font.css;链接样式:link
- 问题:1.一个销售系统,设有各级代理商,每个代理商的表是这样设计的 数据库结构表1: 代理商资料表[id]
- Brendan Eich于1995年在Netscape发明了JavaScript语言,这个语言在过去的一些年里曾是一个最被误解的语言,随着A
- 蜜蜂可以看到紫外线,人则看不到;蛇和蚊子可以看到红外线,人则看不到。火狐(Firefox)浏览器也可以看到人们看不到的东西,但迄今为止,这些
- 在WEB2.0这个词未出现之前,是没有所谓的WEB1.0之说的,那时候的互联网也是没有时代之分的,能上的网站不多,值得上的网站更不多,很多的
- 基于ASP技术开发Internet/Intranet上的MIS系统是非常方便的,首先是它借用了ADO技术和概念,同时
- 如何使用Index Server建立一个网站导航地图?程序代码如下:<html><head><title>asp教程之网站导航 -