go中经常用于并发channal问题引起的协程泄漏

例子:

package mainimport ("log""runtime""time"
)func main() {log.SetFlags(log.LstdFlags | log.Lshortfile)go func() {for {log.Printf("当前 goroutine 数量为:%d\n", runtime.NumGoroutine())time.Sleep(1 * time.Second)}}()for i := 0; i < 10; i++ {ch := make(chan time.Time)go func() {select {case <-ch:case <-time.After(1 * time.Second):}}()go func() {t := <-time.After(3 * time.Second)ch <- t}()log.Println("create a goroutine")time.Sleep(1 * time.Second)}for {}
}

输出

2022/04/24 16:43:52 ch.go:13: 当前 goroutine 数量为:4
2022/04/24 16:43:52 ch.go:29: create a goroutine
2022/04/24 16:43:53 ch.go:13: 当前 goroutine 数量为:4
2022/04/24 16:43:53 ch.go:29: create a goroutine
2022/04/24 16:43:54 ch.go:13: 当前 goroutine 数量为:4
2022/04/24 16:43:54 ch.go:29: create a goroutine
2022/04/24 16:43:55 ch.go:13: 当前 goroutine 数量为:6
2022/04/24 16:43:55 ch.go:29: create a goroutine
2022/04/24 16:43:56 ch.go:29: create a goroutine
2022/04/24 16:43:56 ch.go:13: 当前 goroutine 数量为:9
2022/04/24 16:43:57 ch.go:13: 当前 goroutine 数量为:7
2022/04/24 16:43:57 ch.go:29: create a goroutine
2022/04/24 16:43:58 ch.go:29: create a goroutine
2022/04/24 16:43:58 ch.go:13: 当前 goroutine 数量为:10
2022/04/24 16:43:59 ch.go:13: 当前 goroutine 数量为:9
2022/04/24 16:43:59 ch.go:29: create a goroutine
2022/04/24 16:44:00 ch.go:13: 当前 goroutine 数量为:10
2022/04/24 16:44:00 ch.go:29: create a goroutine
2022/04/24 16:44:01 ch.go:13: 当前 goroutine 数量为:12
2022/04/24 16:44:01 ch.go:29: create a goroutine
2022/04/24 16:44:02 ch.go:13: 当前 goroutine 数量为:13
2022/04/24 16:44:03 ch.go:13: 当前 goroutine 数量为:12
2022/04/24 16:44:04 ch.go:13: 当前 goroutine 数量为:12
2022/04/24 16:44:05 ch.go:13: 当前 goroutine 数量为:12
2022/04/24 16:44:06 ch.go:13: 当前 goroutine 数量为:12
2022/04/24 16:44:07 ch.go:13: 当前 goroutine 数量为:12
2022/04/24 16:44:08 ch.go:13: 当前 goroutine 数量为:12
2022/04/24 16:44:09 ch.go:13: 当前 goroutine 数量为:12
2022/04/24 16:44:10 ch.go:13: 当前 goroutine 数量为:12
2022/04/24 16:44:11 ch.go:13: 当前 goroutine 数量为:12
2022/04/24 16:44:12 ch.go:13: 当前 goroutine 数量为:12
2022/04/24 16:44:13 ch.go:13: 当前 goroutine 数量为:12
2022/04/24 16:44:14 ch.go:13: 当前 goroutine 数量为:12
2022/04/24 16:44:15 ch.go:13: 当前 goroutine 数量为:12
2022/04/24 16:44:16 ch.go:13: 当前 goroutine 数量为:12
2022/04/24 16:44:17 ch.go:13: 当前 goroutine 数量为:12
2022/04/24 16:44:18 ch.go:13: 当前 goroutine 数量为:12
2022/04/24 16:44:19 ch.go:13: 当前 goroutine 数量为:12
2022/04/24 16:44:20 ch.go:13: 当前 goroutine 数量为:12
2022/04/24 16:44:21 ch.go:13: 当前 goroutine 数量为:12
2022/04/24 16:44:22 ch.go:13: 当前 goroutine 数量为:12
2022/04/24 16:44:24 ch.go:13: 当前 goroutine 数量为:12
2022/04/24 16:44:25 ch.go:13: 当前 goroutine 数量为:12
2022/04/24 16:44:26 ch.go:13: 当前 goroutine 数量为:12
2022/04/24 16:44:27 ch.go:13: 当前 goroutine 数量为:12
2022/04/24 16:44:28 ch.go:13: 当前 goroutine 数量为:12
2022/04/24 16:44:29 ch.go:13: 当前 goroutine 数量为:12
2022/04/24 16:44:30 ch.go:13: 当前 goroutine 数量为:12
2022/04/24 16:44:31 ch.go:13: 当前 goroutine 数量为:12
2022/04/24 16:44:32 ch.go:13: 当前 goroutine 数量为:12
2022/04/24 16:44:33 ch.go:13: 当前 goroutine 数量为:12
2022/04/24 16:44:34 ch.go:13: 当前 goroutine 数量为:12
2022/04/24 16:44:35 ch.go:13: 当前 goroutine 数量为:12
2022/04/24 16:44:36 ch.go:13: 当前 goroutine 数量为:12
2022/04/24 16:44:37 ch.go:13: 当前 goroutine 数量为:12
2022/04/24 16:44:38 ch.go:13: 当前 goroutine 数量为:12Process finished with the exit code 130 (interrupted by signal 2: SIGINT)

最后结果一直都是 保持在12, 协程不会释放,如果循环 一直发生,那后果不堪设想

上面造成的原因是: 通道 ch 监听协程 退出的比 唤醒协程快,并且 通道ch 是无缓冲的,导致 唤醒协程 一直阻塞,
解决方法: 将 通道 ch 改为 size 为 1, 可以自己试试看

这种 错误可以通过 模糊检测 可以检测出来
具体可以参考: 检测 Go 程序中并发 Bug 的新方法

go老鸟也会经常出现 并发channal问题引起的协程泄漏相关推荐

  1. Golang并发模型:轻松入门协程池

    goroutine是非常轻量的,不会暂用太多资源,基本上有多少任务,我们可以开多少goroutine去处理.但有时候,我们还是想控制一下. 比如,我们有A.B两类工作,不想把太多资源花费在B类务上,而 ...

  2. 【并发编程二十】协程(coroutine)_协程库

    [并发编程二十]协程(coroutine) 一.线程的缺点 二.协程 三.优点 四.个人理解 五.协程库 1.window系统 2.unix系统(包括linux的各个版本) 2.1.makeconte ...

  3. 并发编程:进程,线程,协程,异步

    并发编程(不是并行)目前有四种方式:多进程.多线程.协程和异步. 多进程编程在python中有类似C的os.fork,更高层封装的有multiprocessing标准库 多线程编程python中有Th ...

  4. python协程 并发数量_Python-并发编程(协程)

    今天说说协程 一.引子 本节的主题是基于单线程来实现并发,即只用一个主线程(很明显可利用的cpu只有一个)情况下实现并发,为此我们需要先回顾下并发的本质:切换+保存状态 cpu正在运行一个任务,会在两 ...

  5. 十四丶并发编程(线程 进程 协程)

    Yuan先生 知识预览 操作系统 回到顶部 操作系统 一 为什么要有操作系统? 现代计算机系统是由一个或者多个处理器,主存,磁盘,打印机,键盘,鼠标显示器,网络接口以及各种其他输入输出设备组成的复杂系 ...

  6. 并发编程:进程+线程+协程

    现代计算机系统是由一个或者多个处理器,主存,磁盘,打印机,键盘,鼠标显示器,网络接口以及各种其他输入 输出设备组成的复杂系统,每位程序员不可能掌握所有系统实现的细节,并且管理优化这些部件是一件挑战性极 ...

  7. 基于协程的并发框架orchid简介

    2019独角兽企业重金招聘Python工程师标准>>> orchid简介 什么是orchid? orchid是一个构建于boost库基础上的C++库,类似于python下的geven ...

  8. python协程学习——写个并发获取网站标题的工具

    ​ 平时做渗透的时候,有时候给的是一些域名.一些 url .一些 ip 或者三者都有,手动去一个个地打开比较浪费时间.我们需要用最短时间发现一些有趣的目标,如 xx 管理后台.于是让我们用 pytho ...

  9. go test 如何输出到控制台_深度剖析 Go 中的 Go 协程 (goroutines) -- Go 的并发

    Go 协程 (goroutine) 是指在后台中运行的轻量级执行线程,go 协程是 Go 中实现并发的关键组成部分. 在上次的课程中,我们学习了 Go 的并发模型.由于 Go 协程相对于传统操作系统中 ...

  10. Flask+Gunicorn(协程)高并发的解决方法探究

    <div> 1.使用Flask的做服务器框架,可以以python code.py的方式运行,但这种方式不能用于生产环境,不稳定,比如说: 有一定概率遇到连接超时无返回的情况 1,通过设置a ...

最新文章

  1. DeepChem | DeepChem的图卷积特征化器
  2. html 运用正则表达式,HTML5 使用正则表达式
  3. java 判断object类型_Java多态的6大特性|乐字节
  4. diffrences between ARP table and MAC address table
  5. 使用awt制作一个简易加法计算器
  6. jQuery基础资料
  7. android 音视频硬编解码
  8. java 验证码识别_【Java】验证码识别解决方案
  9. wine android模拟器,Mac  下运行window 软件,(wine 模拟器)
  10. 1003.Crashing Balloon
  11. 判断鼠标滑轮滚动事件
  12. 越狱Season 1-Episode 1: the pilot
  13. 鼠标放上去会变色的按钮
  14. 四十七、使用bootstrap中的选项卡制作产品特色页面
  15. 厦门信托•震雷先行者集合资金信托计划
  16. 硫化氢探针|H2S荧光探针|hydrogen sulfide荧光探针的结构式
  17. 使用markdown玩转代码架构设计
  18. 商城订单使用优惠卷价格计算逻辑,举例计算
  19. WebOffice(在线Office编辑)
  20. android5.1之vibration学习总结

热门文章

  1. 计算机上无线网络开关在哪里,笔记本无线网络开关在哪里?
  2. html制作钟表盘,jquery+html5制作超酷的圆盘时钟表
  3. Leaflet地图框架使用手册
  4. 客户关系管理系统(CRM)的开发过程中使用到的开发工具总结
  5. 除权除息,前复权,后复权,不复权
  6. 【NAT网络地址转换(私网公网地址、静态NAT、动态NAT、NAPT、Easy IP、NAT Server)】-20211215、20211216
  7. Photoshop CC 2019 软件安装教程
  8. 熵值权重法matlab程序,熵值法确定权重原理及Matlab实现
  9. 高德地图纠偏 php,高德地图开发中,缩放后Marker偏移的问题
  10. 解决支付订单,重复提交问题!