Goroutine使用准则
前言
Gouroutine
是Go开发中最常用的功能之一,开启一个Goroutine很简单,但是想要控制一个Goroutine
的生命周期却需要一些技巧
最常见的是goroutine泄露问题
1 |
|
函数退出后goroutine
并不会退出,而且也不会接收到数据,处于一直被堵塞的状态,并且会占用资源,这就是常见的goroutine
泄露(你以为它结束了,其实它没有)
准则
goroutine最常用的准则
不要开启一个goroutine如果你不知道它什么时候结束
任何时候开启一个goroutine
都要问自己两个问题
- 它什么时候结束
- 如何让它结束
方法
设置超时控制
对于一些goroutine
应该还要设置超时控制,使用context
给goroutine
一个超时时间,这样goroutine
的结束就在掌握之中
1 |
|
设置recover兜底保护
对于一个我们不知道什么时候会启用的goroutine
称为野生goroutine(如调用指定接口其业务逻辑会启动一个goroutine
)
在Gin
框架中,在我的业务逻辑接口中,即使发生了Panic
行为(如数组越界,使用未初始化的map等)也不会使整个程序崩溃,因为在Gin为每一个调用者都自动启动revover( )进行兜底保护
但是如果在业务逻辑的接口中又使用了goroutine
,并且在goroutine中发生了Panic行为,那么就会导致整个程序的崩溃
所以我们对于野生的goroutine要使用recover( )进行兜底保护
1 |
|
使用chan来监听和控制goroutine的生命周期
比如在main函数中同时监听两个端口的正确姿势
- 同时监听,平滑退出
- 能在main中管理
goroutine
的生命周期并知道它何时退出
1 |
|
使用空结构体传递信号(空结构体不占用内存,用来作为通道的信号传递最好)
一旦某个goroutine
出现错误就会发送错误信息给done
done接收到信息后结汇关闭stop,每个有stop通道的goroutine
收到信号后就会优雅关闭服务(Shutdown
函数)
1 |
|
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!