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


猜你喜欢
- 之前用的Python2,连接MySQL用的是MySQLdb。现在换成python3.x了,由于 MySQLdb 模块还不支持 Python3
- 本文主要针对Golang的内置库 net/http 做了简单的扩展,通过添加中间件的形式实现了管道(Pipeline)模式,这样的好处是各模
- 对开区间和闭区间的理解对于开区间,本身已经不包含两端点值,所以根本满足不了连续的第一个要求,所以要说某一开区间连续,我们说是函数在这一开区间
- 和之前C++执行Linux Bash命令的方法 一样,Python依然支持system调用和popen()函数来执行linux bash命令
- 一年中秋至 又见圆月时导语假设农历八月十五,程序员错过了今年的中秋圆月。▼程序员的苦只有他们寄几知道bug,bug,bug,bug,bug,
- 学习了一点opencv的知识于是找了个小项目来实践一下。这里先说明一下,我的实现方法不见得是最好的(因为这只是一个用于练习的项目)仅作参考,
- #region 读写xml文件的2个小函数,2005 4 2 by hyc public void 
- 今天我们继续向大家介绍一款翻页效果的制作。当鼠标移动到链接上时,翻页的链接区除了有悬停效果,还会放大。这样的效果具有很强烈的效果。大家适当美
- 1,为了获取视频,你应该创建一个 VideoCapture 对象。他的参数可以是设备的索引号,或者是一个视频文件。设备索引号就是在指定要使用
- Expire 命令用于设置 key 的过期时间。key 过期后将不再可用。r.set('2', '4028b2883
- 2003年以来,网页的平均尺寸已经增长3倍。从2003到2008,网页的平均尺寸从93.7K增至312K,增幅233%。同时,在这5年之内,
- 我们大家都知道CSS功能的强大,而有关CSS基本的排版控制虽然已有详细的使用说明和参考教程,但还有许多丰富的CSS排版能力,是很少能查到的。
- 删除vue下的node_modules文件夹全局安装rimrafcnpm i -g rimraf进入项目文件夹目录(该目录下包含node_m
- 本文实例讲述了Python设计模式之MVC模式。分享给大家供大家参考,具体如下:一.简单介绍mvc模式 the mo
- 本文实例讲述了python简单实现基于SSL的 IRC bot。分享给大家供大家参考。具体如下:#!/usr/bin/python# -*-
- <form id="myForm" method="post">
- 一、功能简述正是微博如火如荼的时节,其中各个微博的分享功能是网站推广产品的好东东啊,此时如何方便快捷的使用微博的分享功能就显得比较重要了。我
- Python保存网页图片这个是个比较简单的例子,网页中的图片地址都是使用'http://。。。。.jpg'这种方式直接定义的
- Golang HTTP服务在上线时,需要重新编译可执行文件,关闭正在运行的进程,然后再启动新的运行进程。对于访问频率比较高的面向终端用户的产
- 前言为了上班摸鱼方便,今天自己写了个爬取笔趣阁小说的程序。好吧,其实就是找个目的学习python,分享一下。一、首先导入相关的模块impor