一楼[ZY]的留言 “当一个channel满了之后 无法继续插入 会报错,但是放到协程里面却可以在满了之后 继续插入数据 为什么呢?”
我的理解是这样的:
1.你的代码里有生产者和消费者,使用for循环开启了10个协程,channel还没满的时候就被消费者提前消费掉了,其实只能添加10数据,可以把消费者去掉, 并且加上日志打印:代码如下:
var wg sync.WaitGroup
num := 10
ch := make(chan int, num)
for i := 0; i < 1000; i++ {
wg.Add(1)
go func(i int) {
ch <- i // 协程满后会阻塞,导致无法执行厦门的wg.Done()导致死锁报异常
fmt.Printf("执行协程:%d\n",i)
wg.Done()
}(i)
wg.Wait()
}
2.可以在一个协程里循环添加超过channel大小的数据,依旧会阻塞
func TestChannelPush(t *testing.T) {
ch := make(chan int, 10)
var wg sync.WaitGroup
wg.Add(1)
pushChannel(ch,&wg)
wg.Wait()
}
func pushChannel(ch chan int, wg *sync.WaitGroup) {
go func() {
for i := 0; i < 100; i++ {
ch <- i
}
wg.Done()
}()
}
因为这里用了WaitGroup,所以会有死锁,实际上是会阻塞。
展开