// 死循环
当代码里循环的退出条件不可达时,会令该goroutine进入死循环中,进而导致资源一直无法释放,引起泄露 。在实际项目中,往往死循环会发生在一些后台的常驻服务中 。goroutine泄露的预防和检测
// 预防
1. 最重要的一点,在创建goroutine时,就应该知道goroutine啥时能结束 。
2. channel引起的goroutine泄露问题,主要是看在channel阻塞goroutine时,该goroutine的阻塞是正常的,还是可能导致协程永远没有机会执行 。若是后者,则极大可能会造成协程泄露 。
channel的实际使用中,常用的两种模型:生产者-消费者模型;master-worker模型 。一般的解决方案是:当主线程结束时,告知生产协程,生产协程得到通知后,进行清理工作然后退出;为每个worker任务制定超时,当超时触发,返回给master超时信息,并结束该worker协程 。具体代码方案是使用上下文context 。
3. 实现循环语句时必须清晰地知道退出循环的条件,避免死循环 。
// 检测
1. Go提供的pprof工具 。
2. 利用runtime.NumGoroutine接口,实时查看程序中运行的goroutine数 。
3. 开源三方profiling库 。
gops,地址:
推荐阅读
- 《王者荣耀》连胜封号规则是怎样的?
- Spring Boot+Socket实现与html页面的长连接
- 暹罗猫价格多少钱一只?
- 早安语录正能量的句子有哪些?
- Linux 原来是这么管理内存的
- 小雪天晴一冬的天气会怎么样
- 中国十大名茶最新排名是怎样的?
- java多线程编程的核心——AQS独占模式原理解析
- 互动场景下的低延迟编码技术
- 你的 Mac 用对了吗?推荐一些 Mac 上比较好用的软件
