本文摘自网络,作者,侵删。
1、定义一个没有buffer的chan,但是go routine里面可能出现两次write,导致此routine block,线上高并非压力之下,随着内存不断增加,最后OOM,代码示例如下:
func main() {
a := make(chan int)
go getValueRoutine(a)
b := <-a
fmt.Println(b)
}
func getValueRoutine(a chan int) {
if err!=nil{
a <- kongStr
}
a <- realStr
}
2、同理定义带有1个buffer的chan,但是go routine里面可能出现3次write,导致此routine block,随之内存增加
注意:
最好用带buffer的chan,没有buffer的完全阻塞;
对于if else比较多的逻辑,特别注意chan的写入是否及时return;
为什么有一个buffer的channel,出现2次write不会有问题?可以自己思考一下
本文来自:简书
感谢作者:Awhipltz
查看原文:golang-chan block 内存OOM(线上问题)
相关阅读 >>
关于Go sql中的query、exec和prepare使用对比(附网络抓包)
deepin下配置protobuf(含Go语言protoc-gen-Go插件安装)
更多相关阅读请进入《Go》频道 >>
Go语言101
一个与时俱进的Go编程知识库。