golang定时器和超时的使用详解
作者:誠寜 发布时间:2023-07-23 21:35:12
标签:golang,定时器,超时
我就废话不多说了,大家还是直接看代码吧~
func main() {
var a chan string
a =make(chan string)
go sendDataTo(a)
go timing()
getAchan(10*time.Second,a)
}
func sendDataTo(a chan string) {
for {
a <- "我是a通道的数据"
time.Sleep(1e9 *3)
}
}
//在一定时间内接收不到a的数据则超时
func getAchan(timeout time.Duration, a chan string) {
var after <-chan time.Time
loop:
after = time.After(timeout)
for{
fmt.Println("等待a中的数据,10秒后没有数据则超时")
select {
case x :=<- a:
fmt.Println(x)
goto loop
case <-after:
fmt.Println("timeout.")
return
}
}
}
func timing() {
//定时器,10秒钟执行一次
ticker := time.NewTicker(10 * time.Second)
for {
time := <-ticker.C
fmt.Println("定时器====>",time.String())
}
}
补充:golang的定时器NewTimer、NewTicker使用
废话不多说,直接看代码
package main
import (
"fmt"
"sync"
"time"
)
/**
*ticker只要定义完成,从此刻开始计时,不需要任何其他的操作,每隔固定时间都会触发。
*timer定时器,是到固定时间后会执行一次
*如果timer定时器要每隔间隔的时间执行,实现ticker的效果,使用 func (t *Timer) Reset(d Duration) bool
*/
func main() {
var wg sync.WaitGroup
wg.Add(2)
//NewTimer 创建一个 Timer,它会在最少过去时间段 d 后到期,向其自身的 C 字段发送当时的时间
timer1 := time.NewTimer(2 * time.Second)
//NewTicker 返回一个新的 Ticker,该 Ticker 包含一个通道字段,并会每隔时间段 d 就向该通道发送当时的时间。它会调
//整时间间隔或者丢弃 tick 信息以适应反应慢的接收者。如果d <= 0会触发panic。关闭该 Ticker 可
//以释放相关资源。
ticker1 := time.NewTicker(2 * time.Second)
go func(t *time.Ticker) {
defer wg.Done()
for {
<-t.C
fmt.Println("get ticker1", time.Now().Format("2006-01-02 15:04:05"))
}
}(ticker1)
go func(t *time.Timer) {
defer wg.Done()
for {
<-t.C
fmt.Println("get timer", time.Now().Format("2006-01-02 15:04:05"))
//Reset 使 t 重新开始计时,(本方法返回后再)等待时间段 d 过去后到期。如果调用时t
//还在等待中会返回真;如果 t已经到期或者被停止了会返回假。
t.Reset(2 * time.Second)
}
}(timer1)
wg.Wait()
}
运行结果:
get ticker1 2018-09-07 22:44:29
get timer 2018-09-07 22:44:29
...
额外说明:
time.NewTicker定时触发执行任务,当下一次执行到来而当前任务还没有执行结束时,会等待当前任务执行完毕后再执行下一次任务。查阅go官网的文档和经过代码验证。
time.NewTimer和Reset()函数实现定时触发,Reset()函数可能失败,经测试。
来源:https://blog.csdn.net/mofiu/article/details/77318173


猜你喜欢
- 整个数据获取的信息是通过房源平台获取的,通过下载网页元素并进行数据提取分析完成整个过程导入相关的网页下载、数据解析、数据处理库from fa
- 场景描述:场景描述:一个接口(IPerson)有很多个的字段,可能有几百。而且这些字段都是必须的。我们需要使用这个接口,但是我又不可能使用它
- 废话不多说,估计只有我这个菜鸟废了2个小时才搞出来,主要是我想了太多方法来实现,最后都因为这因为那的原因失败了间接说明自己对可变与不可变类型
- 本文实例讲述了Bootstrap简单实用的表单验证插件BootstrapValidator用法。分享给大家供大家参考,具体如下:Bootst
- 我的路由:const routerMap = [ { path: '/',  
- 1、把这段拷到DW里,存成HTML文件。<HTML><HEAD><TITLE>move backgrou
- 1、什么是哈希hashhash一类算法,该算法接受传入的内容,经过运算得到一串hash值hash值的特点:只要传入的内容一样,得到的hash
- 大家可以先参考官方演示文档:效果图:'''==============3D scatterplot=========
- 本文实例讲述了Python编程实现正则删除命令功能。分享给大家供大家参考,具体如下:脚本用途:在DOS下使用del功能箭头,不支持正则表达式
- 在绑定属性时,如果我们直接把属性暴露出去,虽然写起来很简单,但是,没办法检查参数,导致可以把成绩随便改:s = Student()s.sco
- 在默认的情况下,MySQL搜索不区分大小写(但某些字符集始终区分大小写,如czech)。这意味着,如果你使用col_name LIKE
- Mysql简易索引一、没有索引的时候如何查找先忽略掉索引这个概念,如果现在直接要查某条记录,要如何查找呢?在一个页中查找如果表中的记录很少,
- 1.相关函数的讲解image_to_data()的输出结果是表格形式,输出变量的类型依旧是字符串。你会得到一个这样的列表['leve
- torch.Tensor.detach()的使用detach()的官方说明如下:Returns a new Tensor, detached
- 在python中有不少对于集合迭代的方法,我们把程序运行后的再一次循环叫做迭代,每一次都循环都可以看做是一次迭代。那么在迭代结束后,我们需要
- CSS3草案中定义了{opacity:来声明元素的透明度,这已经得到了大多数现代浏览器的支持,而IE则很早通过特定的私有属性filter来实
- 一般采用的方法:self.window = Qdialog() # 实例化self.window.show() # 显示界面用这种方法只能打
- Go语言内置int转string至少有3种方式:fmt.Sprintf("%d",n)strconv.Itoa(n)st
- 数据是企业核心资产,数据对企业而言是最重要的工作之一。稍有不慎,极有可能发生数据无意泄露,甚至被黑客恶意窃取的风险。每年业界都会传出几起大事
- 1. 用Dreamweaver 4.0制作闪动的Flash按钮选择菜单Insert→Interactive Images→Flash But