如何确保goroutine关闭通道前,通道已读取完整个缓冲区?
关于Go中Lexical Concurrency模式的通道读取与关闭问题
首先明确:通道的range循环会一直读取直到通道被关闭,而发送方的goroutine在完成所有发送操作后才会关闭通道,这两者的协作是通过Go的通道同步机制天然保证的,完全不需要担心goroutine调度的问题。
具体拆解你的代码逻辑:
chanOwner里的goroutine要发送6个值(i从0到5),但通道缓冲区只有5个位置。前5个值会直接写入缓冲区,第6个值因为缓冲区已满,会被阻塞,直到consumer从通道中读取走一个值,它才能完成发送。- 只有当这个goroutine把6个值全部发送完毕后,
defer close(results)才会执行,关闭通道。 consumer中的range循环会持续读取通道内的所有值——不管是缓冲区里的存量,还是发送方后续阻塞后发送的新值——直到通道被关闭。一旦通道关闭,range循环就会退出,而此时所有数据必然已经被读取完毕,因为通道关闭的时机是所有发送操作完成之后。
总结来说:发送方的关闭动作是所有发送任务的收尾操作,接收方的range会一直读到通道关闭,这种机制从设计上就确保了缓冲区的所有数据都会被读取,和goroutine的调度时机没有冲突。
内容的提问来源于stack exchange,提问作者Baris Balli
相关产品推荐
相关产品推荐

