开启5个协程取监听一个缓冲channel,这为什么会报错呢

直接上代码

func main() {
    var sw sync.WaitGroup

    ch := make(chan string,1)
    for i := 0 ; i < 5;i++{
        sw.Add(1)

        go func(gl chan string){

            for c := range gl{
                fmt.Println(c)
                sw.Done()

            }

        }(ch)
    }

    ch <- "Message"

    sw.Wait()

}

我想着5个协程取监听一个channel 但是运行就报错,range 空channel 就不行吗?

已邀请:

simple - 既要有梦想,又要有实力

赞同来自: toukii binb

下次把错误信息贴出来嘛,首先sync.WaitGroup的用法不正确,Done method不应该在for循环里,但它不是你的问题的核心。你这个程序最后会死锁,5个Goroutine在等着channel来数据,一个main Goroutine在等着5个Goroutine结束,最后都处在wait状态,go runtime提供了检测机制,然后会报错,别的语言的话可能就死等在那里了。

tamchen

赞同来自: fanyang

在这种情况下,只有一个goroutine能够完整执行,其他四个都会阻塞,所以主goroutine一直卡在sw.Wait,所以直接就抛异常了,我觉得可以在内部处理时加个select 超时机制,

keeprunning

赞同来自:

报啥错? 你的sw.Done(),不应该放在for外面吗?

Mrwxj - 图样图森破

赞同来自:

func main() {
   var sw sync.WaitGroup

        ch := make(chan string,1)
        for i := 0 ; i < 1;i++{
            sw.Add(1)

            go func(gl chan string){
                fmt.Println(<-gl)
                sw.Done()
            }(ch)
        }

        ch <- "Message"

        sw.Wait()

}

pathbox - https://pathbox.github.io/

赞同来自:

用select 没遇到报错问题, 可以看完之前写的帖子

要回复问题请先登录注册