Concurrency 如何在没有死锁的情况下在缓冲通道上循环?

Concurrency 如何在没有死锁的情况下在缓冲通道上循环?,concurrency,go,channel,Concurrency,Go,Channel,我想知道如何排空/关闭缓冲通道,以免陷入死锁?我使用range来循环通道,但是看起来虽然它们是“读取”的,但它们并不像非缓冲通道那样被关闭 package main func main() { cp := 2 ch := make(chan string, cp) for i := 0; i < cp; i++ { go send(ch) } go send(ch) for lc := range ch {

我想知道如何排空/关闭缓冲通道,以免陷入死锁?我使用range来循环通道,但是看起来虽然它们是“读取”的,但它们并不像非缓冲通道那样被关闭

package main

func main() {

    cp := 2
    ch := make(chan string, cp)

    for i := 0; i < cp; i++ {
        go send(ch)
    }
    go send(ch)

    for lc := range ch {
        print(lc)

    }

}

func send(ch chan string) {

    ch <- "hello\n"

}
主程序包
func main(){
cp:=2
ch:=制造(成串,cp)
对于i:=0;ich您可以使用关闭通道。这必须在所有并发处理完成后调用。如何执行取决于您想要执行的操作

在您当前的体系结构中,您似乎必须建立一个全局状态,该状态跟踪您的所有进程并确定最后一个进程已完成。例如,可以使用

func send(c chan string, wg *sync.WaitGroup) {
    defer wg.Done()
    // ...
}

wg := &sync.WaitGroup{}

for i := 0; i < cp; i++ {
    wg.Add(1)
    go send(ch, wg)
}
wg.Add(1)
go send(ch, wg)

wg.Wait()
close(ch)

for e := range(ch) {
    // ...
}
func发送(c chan字符串,wg*sync.WaitGroup){
推迟工作组完成()
// ...
}
wg:=&sync.WaitGroup{}
对于i:=0;i

请注意,关闭通道,然后对其进行迭代,只会得到通道中排队的元素。这意味着,当通道关闭时,任何想在通道中添加值的goroutine都无法再执行此操作。

为什么会有
wg.Add(1)
go send(ch,wg)
(在for循环之后)我认为这是一个打印错误,对吗?没有打印错误。对于每个修改频道的GOODUTY,你可以向WAITE组添加一个数字。考虑阅读文档中的例子。对……,我没有看到< <代码> > <代码>循环外的GO例程。