2 回答
TA贡献1829条经验 获得超7个赞
您的代码中存在多个问题。
在循环中,您正在生成多个 (3) goroutines 运行func2
,并且在中func2
,您将数据发送到ch2
并调用close(ch2)
。这是个问题。ch2
当一个 goroutine 将数据发送到时,另一个goroutine 可能会关闭该通道,这会导致:
panic: close of closed channel
goroutine 6 [running]:
main.func2(0xc00006c000, 0xc000056180)
/home/projects/go-tuts/pipeline-loop.go:36 +0x72
created by main.main
/home/projects/go-tuts/pipeline-loop.go:16 +0x10f
exit status 2
通常,您不需要多次关闭通道 - 您只需要在它们全部完成后关闭它们。WaitGroup
为此你需要另一个;您需要将两个函数都传递给 a WaitGroup
。
更新:
我个人使用一种“工作”模式,将数据生成到同一通道,并且在完成所有工作后需要关闭该通道:
for something {
wg.Add(1)
go func(i int) {
work(ch)
wg.Done()
}
}
go func() {
wg.Wait()
close()
}()
我认为保持 API 清洁是一个好主意,WorkGroup因为WorkGroup它是关于如何同步工作而不是如何完成工作的。
我已将您的代码更改为这种模式:https ://play.golang.org/p/vdCNsxWhgyQ
TA贡献1829条经验 获得超6个赞
我怀疑您只希望一个通道从 ch1 读取并写入 ch2。创建 3 个 go-routines 来做同样的事情没有多大意义(而且你最终也会关闭相同的通道 multiple time 这会导致恐慌,正如 leaf bebop 指出的那样)
func main() {
ch1 := make(chan int, 10) // Use buffered channel so as to avoid clogging
ch2 := make(chan string, 10)
var wg sync.WaitGroup
for i := 0; i < 3; i++ {
wg.Add(1)
go func1(i, ch1, &wg)
}
go func2(ch1, ch2)
wg.Wait()
close(ch1)
for val := range ch2 {
fmt.Println(val)
}
}
- 2 回答
- 0 关注
- 146 浏览
添加回答
举报