Go goroutine与channel使用出现死锁及channel长度为0问题咨询
问题原因及解决方案
1. 为什么创建的channel长度为0
- Go中channel分为有缓冲和无缓冲两种,你使用
make(chan int)未指定第二个容量参数,创建的是无缓冲channel,本身容量就是0 - 无缓冲channel不会缓存任何数据,只有发送方和接收方同时就绪时才能完成数据传递,数据不会在channel中停留。
len(channel)返回的是channel中当前暂存的元素个数,所以你打印len(mychannel)时,子goroutine还未开始发送数据,返回的长度自然为0,哪怕后续收发过程中,无缓冲channel的len绝大多数时候也都是0
2. 死锁原因
- 你使用
for range遍历channel时,该遍历会持续阻塞直到channel被显式关闭,才会退出循环 - 你的
takeChn函数发送完10个整数后,直接结束运行,没有关闭channel,主goroutine会永远卡在遍历channel的逻辑上,此时没有其他活跃的goroutine在运行,Go runtime就会抛出死锁错误
修复方案
只需要在takeChn函数发送完所有数据后,关闭channel即可,修复后的代码如下:
package main import ( "fmt" ) func main() { mychannel := make(chan int) go takeChn(mychannel) fmt.Println("length", len(mychannel)) for res := range mychannel { fmt.Println("firstFunc", res, len(mychannel)) } } func takeChn(c chan int) { for i := 0; i < 10; i++ { c <- (i + 1) } // 新增:发送完数据后关闭channel close(c) }
内容的提问来源于stack exchange,提问作者SenthilOO7
相关产品推荐
相关产品推荐

