如何安全close go 的channel

golang 在多协程下,  不清楚谁是 sender 谁是 recver 的时候, close(chan) 和 chan<-data 两个都很容易报错

 

那么close 到底怎么才能更安全,更正确的,解决呢? 

单协程 直接close ,太low,我们不考虑,只考虑最复杂环境下的情况.

 

 第一种方法 暴力关闭channel ,只需要增加 recover() 就可以了

 

第二种方法  通过对变量加锁,或者直接使用sync.Once 来控制 close 只有一次

 

 第三种方法 创建两个chan,一个永远不close,只进行 无限 发送,  单个接收; 一旦接收了 ,就关闭另外一个; 另外一个 返还给外部, 只判断 close的情况,不进行发送和直接close

 

第四种方法 比较简单,总是 使用select就可以了,

done := make(chan struct{})

// 复杂环境下 并发 进行关闭
select{
      case <-done:
      default:
                close(done)
}

 

//复杂环境 并发 检测是否关闭


select{
      case <-done
             //关闭处理
             return 
       default:
            //没有关闭的处理
}

 

 

 

https://zhuanlan.zhihu.com/p/32529039

上一篇:ChanBase


下一篇:golang context的WithTimeout实现调用自定义函数超时处理