资源不断被耗尽,排查起来焦头烂额:如何避免 goroutine 泄露?


资源不断被耗尽,排查起来焦头烂额:如何避免 goroutine 泄露?

文章插图
 
Go 中的并发性是以 goroutine(独立活动)和 channel(用于通信)的形式实现的 。处理 goroutine 时,程序员需要小心翼翼地避免泄露 。如果最终永远堵塞在 I/O 上(例如 channel 通信),或者陷入死循环,那么 goroutine 会发生泄露 。即使是阻塞的 goroutine,也会消耗资源,因此,程序可能会使用比实际需要更多的内存,或者最终耗尽内存,从而导致崩溃 。让我们来看看几个可能会发生泄露的例子 。然后,我们将重点关注如何检测程序是否受到这种问题的影响 。
发送到一个没有接收者的 channel
资源不断被耗尽,排查起来焦头烂额:如何避免 goroutine 泄露?

文章插图
 
假设出于冗余的目的,程序发送请求到许多后端 。使用首先收到的响应,丢弃后面的响应 。下面的代码将会通过等待随机数毫秒,来模拟向下游服务器发送请求:
资源不断被耗尽,排查起来焦头烂额:如何避免 goroutine 泄露?

文章插图
 
输出:
资源不断被耗尽,排查起来焦头烂额:如何避免 goroutine 泄露?

文章插图
 
每次调用 


    推荐阅读