Concurrency 如何在没有死锁的情况下在缓冲通道上循环?
我想知道如何排空/关闭缓冲通道,以免陷入死锁?我使用range来循环通道,但是看起来虽然它们是“读取”的,但它们并不像非缓冲通道那样被关闭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 {
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;i ch您可以使用关闭通道。这必须在所有并发处理完成后调用。如何执行取决于您想要执行的操作
在您当前的体系结构中,您似乎必须建立一个全局状态,该状态跟踪您的所有进程并确定最后一个进程已完成。例如,可以使用
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例程。