Golang 如何优雅关闭 channel

Golang 内建的 close 方法可以关闭 channel,如果往已经关闭的 channel 发送数据,则会报错:panic: close of closed channel.

看如下代码,在一段时间内,生产者可以不断往 channel 写入数据,消费者进行处理,一段时间后 channel 关闭了,这个时候如果还有数据往 channel 发送,程序就会报错。

多运行几次出错的概率会比较大:

如何优雅关闭 channel

那么在往通道发数据前如何判断通道是否关闭呢?

1._,ok := <- jobs

此时如果 channel 关闭,ok 值为 false,如果 channel 没有关闭,则会漏掉一个 jobs

2.使用 select 方式

再创建一个 channel,叫做 timeout,如果超时往这个 channel 发送 true,在生产者发送数据给 jobs 的 channel,用 select 监听 timeout,如果超时则关闭 jobs 的 channel.

完整代码如下:

这样就可以保证不会往已经关闭的 channel 中发送数据了。


后记:很高兴本文被 GoCN 网站每日新闻收录(https://gocn.io/question/1329),例子其实是参考网上的一篇文章,内容是根据自己的理解整理。

打赏