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