Golang停止ticker断续器
1.原代码如下
package mainimport ("fmt""time"
)func main() {intchan := make(chan int,1)ticker := time.NewTicker(time.Second)go func() {for range ticker.C{ //每隔1s执行一次select {case intchan <- 1:case intchan <- 2:case intchan <- 3:}}fmt.Println("End.[sender]")}()var sum intfor e:= range intchan{fmt.Printf("received:%v\n",e)sum += eif sum>=5{ fmt.Printf("got:%v\n",sum)break}}fmt.Println("end.[receiver]")
}
- 输出结果
received:3 received:2 got:5 end.[receiver]
- 上述程序中,发送方会用断续器ticker每隔1s向intchan通道发送一个范围为[1,3]的伪随机数,这个发送操作并不会主动停止。接收方会一致累加接到的数,直到其和大于5停止。
- 运行多次,End.[sender]始终无法打印出来
2.修改代码:在接收方暂停断续器ticker.stop
- 在接收方加入ticker.Stop()代码,暂停断续器,查看是否能打印输出End.[sender]
package mainimport ("fmt""time"
)func main() {intchan := make(chan int,1)ticker := time.NewTicker(time.Second)go func() {for range ticker.C{select {case intchan <- 1:case intchan <- 2:case intchan <- 3:}}fmt.Println("End.[sender]")}()var sum intfor e:= range intchan{fmt.Printf("received:%v\n",e)sum += eif sum>=5{fmt.Printf("got:%v\n",sum)ticker.Stop()break}}//time.Sleep(time.Second*2) // 测试用,当主goroutine休眠了1s仍然无法输出End.[sender]fmt.Println("end.[receiver]")
}
- 当和大于5时,暂停断续器,仍然无法打印输出End.[sender],即使主goroutine休眠1s
- 解释:ticker的stop方法,该方法会停止计时,意味着不会向定时器的管道中写入事件,但管道并不会关闭。管道只有在使用完成后,声明周期结束后才会自动释放。
- 即使停止了断续器,循环卡在循环range ticker.C,无法继续向下执行,所以无法打出End.[sender]
3.修改代码:添加一个stopchan管道
- 添加一个stopchan管道,当主goroutine中sum大于等于5时,满足条件,向stopchan中传入数据。因为stopchan原先无数据,在select中无法执行该case,处于阻塞状态,当得到数据后,便会执行该case,执行其中代码
package mainimport ("fmt""time"
)func main() {intchan := make(chan int,1)stopchan := make(chan bool)ticker := time.NewTicker(time.Second)go func() {for range ticker.C{select {case intchan<-1:case intchan<-2:case intchan<-3:case stop:=<-stopchan:if stop{ticker.Stop()fmt.Println("End.[sender]")}}}fmt.Println("End.[sender]")}()var sum intfor e:= range intchan{fmt.Printf("received:%v\n",e)sum += eif sum>=5{fmt.Printf("got:%v\n",sum)stopchan <- truebreak}}fmt.Println("end.[receiver]")
}
- 输出结果
received:1
received:3
received:2
got:6
End.[sender]
end.[receiver]
Golang停止ticker断续器相关推荐
- golang并发编程-04-通道-02-定时器、断续器
文章目录 1. 定时器 1.1 time.NewTimer 1.2 <-time.After() 1.3 停止 1.4 定时器重置 2 断续器 2.1 断续器使用 2.2 断续器中断 1. 定时 ...
- Golang正确停止Ticker
Golang可以利用time包的Ticker实现定时器的作用,最近使用Ticker时,发现调用Ticker的Stop方法无法正确的停止Ticker,协程会阻塞在等待Ticker的C通道处,精简后的代码 ...
- Golang如何正确的停止Ticker
Golang可以利用time包的Ticker实现定时器的作用,最近使用Ticker时,发现调用Ticker的Stop方法无法正确的停止Ticker,协程会阻塞在等待Ticker的C通道处,精简后的代码 ...
- Go 定时器和断续器
1.定时器 Go语言中定时器可以实现在指定时间点执行特定的事件,定时器的实质是单向通道,time.Timer结构体类型中有一个time.Time类型的单向chan,具体声明如下: type Timer ...
- go - time包的定时器/断续器
from: https://www.kancloud.cn/digest/batu-go/153534 定时器 在time包中有两个函数可以帮助我们初始化time.Timer time.Newtime ...
- go time包定时器和断续器
定时器 在time包中有两个函数可以帮助我们初始化time.Timer time.Newtimer函数 初始化一个到期时间据此时的间隔为3小时30分的定时器 t := time.Newtimer(3* ...
- 介绍 Go 断续器(Tickers)
介绍 Go 断续器(Tickers) 本文我们介绍 Go 断续器(Tickers)以及如何在应用中有效使用断续器.当我们需要在特定时间间隔内周期性重复执行动作,我们可以使用断续器.与协程一起使用可以实 ...
- Golang爬虫终极杀器——Chromedp让你成为二维码登陆终结者(教程)
Golang爬虫终极杀器--Chromedp让你成为二维码登陆终结者(教程) Github源码 - chromedp 文章项目Gitee源码 1 Chromedp是什么 chromedp是一个更快.更 ...
- Golang实现文件搜索器
Golang实现文件搜索器 前言 一.文件搜索器 二.使用步骤 1.查看帮助 2.查询文件 三.代码说明 1.命令行参数解析 2.递归查询实现 四.完整代码 前言 这个搜索器使用到了Golang fl ...
最新文章
- 图像处理入门 100 题,有人把它翻译成了中文版!
- [异能程序员]第五章 出手(第一更)
- 第三方应用如何在SAP Kyma上进行服务注册
- html语言右对齐,在HTML中右对齐块元素
- mysql 协议的query包及解析
- 分析udp数据报_开发需知!!!TCP和UDP的特点和区别
- 本地未安装Oracle数据库,如何连接远程Oracle数据库
- 数据库工作笔记006---CentOS 初次登录mysql
- 训练AI太辛苦?OpenAI新方法:不如让AI之间互教吧
- [原创]Allegro 导入DXF文件,保留布好的线路信息
- Flink 生态:Pulsar Connector 机制剖析
- python 笔记:h5py
- MyCat2测试实战 -- 王者归来的故事
- EXCEL批量修改文件名
- 【AppStore排行榜游戏安利】目录
- 我搭的神经网络不 work 该怎么办!看看这 11 条新手最容易犯的错误
- 链接元宇宙,开启新纪元
- leetcode 198打家劫舍
- Android调用新版百度天气api,解决地理编码问题
- 前端学习——HTML(二) 列表