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断续器相关推荐

  1. golang并发编程-04-通道-02-定时器、断续器

    文章目录 1. 定时器 1.1 time.NewTimer 1.2 <-time.After() 1.3 停止 1.4 定时器重置 2 断续器 2.1 断续器使用 2.2 断续器中断 1. 定时 ...

  2. Golang正确停止Ticker

    Golang可以利用time包的Ticker实现定时器的作用,最近使用Ticker时,发现调用Ticker的Stop方法无法正确的停止Ticker,协程会阻塞在等待Ticker的C通道处,精简后的代码 ...

  3. Golang如何正确的停止Ticker

    Golang可以利用time包的Ticker实现定时器的作用,最近使用Ticker时,发现调用Ticker的Stop方法无法正确的停止Ticker,协程会阻塞在等待Ticker的C通道处,精简后的代码 ...

  4. Go 定时器和断续器

    1.定时器 Go语言中定时器可以实现在指定时间点执行特定的事件,定时器的实质是单向通道,time.Timer结构体类型中有一个time.Time类型的单向chan,具体声明如下: type Timer ...

  5. go - time包的定时器/断续器

    from: https://www.kancloud.cn/digest/batu-go/153534 定时器 在time包中有两个函数可以帮助我们初始化time.Timer time.Newtime ...

  6. go time包定时器和断续器

    定时器 在time包中有两个函数可以帮助我们初始化time.Timer time.Newtimer函数 初始化一个到期时间据此时的间隔为3小时30分的定时器 t := time.Newtimer(3* ...

  7. 介绍 Go 断续器(Tickers)

    介绍 Go 断续器(Tickers) 本文我们介绍 Go 断续器(Tickers)以及如何在应用中有效使用断续器.当我们需要在特定时间间隔内周期性重复执行动作,我们可以使用断续器.与协程一起使用可以实 ...

  8. Golang爬虫终极杀器——Chromedp让你成为二维码登陆终结者(教程)

    Golang爬虫终极杀器--Chromedp让你成为二维码登陆终结者(教程) Github源码 - chromedp 文章项目Gitee源码 1 Chromedp是什么 chromedp是一个更快.更 ...

  9. Golang实现文件搜索器

    Golang实现文件搜索器 前言 一.文件搜索器 二.使用步骤 1.查看帮助 2.查询文件 三.代码说明 1.命令行参数解析 2.递归查询实现 四.完整代码 前言 这个搜索器使用到了Golang fl ...

最新文章

  1. 图像处理入门 100 题,有人把它翻译成了中文版!
  2. [异能程序员]第五章 出手(第一更)
  3. 第三方应用如何在SAP Kyma上进行服务注册
  4. html语言右对齐,在HTML中右对齐块元素
  5. mysql 协议的query包及解析
  6. 分析udp数据报_开发需知!!!TCP和UDP的特点和区别
  7. 本地未安装Oracle数据库,如何连接远程Oracle数据库
  8. 数据库工作笔记006---CentOS 初次登录mysql
  9. 训练AI太辛苦?OpenAI新方法:不如让AI之间互教吧
  10. [原创]Allegro 导入DXF文件,保留布好的线路信息
  11. Flink 生态:Pulsar Connector 机制剖析
  12. python 笔记:h5py
  13. MyCat2测试实战 -- 王者归来的故事
  14. EXCEL批量修改文件名
  15. 【AppStore排行榜游戏安利】目录
  16. 我搭的神经网络不 work 该怎么办!看看这 11 条新手最容易犯的错误
  17. 链接元宇宙,开启新纪元
  18. leetcode 198打家劫舍
  19. Android调用新版百度天气api,解决地理编码问题
  20. 前端学习——HTML(二) 列表

热门文章

  1. 电信天翼路由器 连接另外一个路由器
  2. 网络编程之Socket零基础入门Demo
  3. 小白入门C语言之浮点数详解
  4. banner设计怎么思考
  5. 【操作系统】第3章 内存管理
  6. 起步翻转课堂的一点事儿——对话实录
  7. OSChina 周日乱弹 ——我对象整天在家打游戏,怎么办?
  8. Android源码阅读工具AndroidXRef使用说明
  9. 成功举办!805个团队参赛~
  10. IE无法上网,远程计算机或设备将不接受连接,其他浏览器可用