通道写完后,必须关闭通道,否则range遍历会出现死锁,请问这句话对吗?
那么如果我有一个场景,一个goroutine往通道写数据,一个或多个goroutine从通道读数据,这种情况是没有关闭通道的,那应该怎么写?
补充:
我提的问题有点没说清楚,这个往通道写是个死循环的不断写的过程,读也是不断的读,所以你怎么关闭通道?目前我是开一个goroutine不断写,开5个goroutine用range读,尚没有问题,但是看书有这么一句所以问问。
这个通道是不断写数据的,所以不存在“通道写完后”,所以也无法关闭,那么另外的goroutine就只管range读取数据就好了可以吗?,问题改成这个,理解对吗,目前程序运行没有报错,只是请教一下这样写是否规范。
没错, 关闭 channel 会导致
for range
退出循环.但, 用简单关闭 channel 的方式控制读写 routine 是危险的, 因为写入已经关闭的 channel 会直接崩溃.
所以你得给 channel 加个状态值, 防止这种情况发生. 当然了, 你也可以不用 channel, 自己用锁实现.
下面举两个例子, 分别是利用 channel 和不用 channel 实现的 生产/消费 模型.
注意: 例子只提供思路, 并不完善.
用 channel
不用 channel