背景
最近使用go开发后端服务,服务关闭需要保证channel中的数据都被读取完,理由很简单,在收到系统的中断信号后,系统需要做收尾工作,保证channel的数据都要被处理掉,然后才可以关闭系统。
后面我会给出方案,见示例代码,但在解决这个问题之前我们先了解下close channel的一些特性。
channel
- 关闭channel
ch := make(chan bool)
close(ch)
close(ch) // 这样会panic的,channel不能close两次
- 向已经关闭的channel写数据
ch := make(chan string)
close(ch)
ch <- "good" // 会panic的
- 从已经关闭的channel读取数据
需要分两种情况:
- 无缓冲channel或者缓冲channel已经读取完毕
- 缓冲channel未读取完毕,可以继续读取channel中的剩余的数据
//无缓冲channel
ch := make(chan string)
close(ch)
i := <-