2 回答
TA贡献1982条经验 获得超2个赞
您有多个关闭results通道的 goroutine。
func worker(ID int, jobs <-chan int, results chan<- int) {
for job := range jobs {
fmt.Println("Worker ", ID, " is working on job ", job)
time.Sleep(1000*time.Millisecond)
fmt.Println("Worker ", ID, " completed work on job ", job)
results <- job
}
close(results) <<<<-------- Here
}
worker你在三个不同的并发 goroutine 中运行这个函数。第一个到达标记线的人关闭通道,其他人尝试results <- job在循环中的关闭通道上发送。
TA贡献1873条经验 获得超9个赞
Eli Bendersky 的回答描述了这个问题。这个答案描述了修复。我知道你没有要求修复,但我假设你有兴趣。所以就在这里。
修复方法是在关闭通道之前等待工作 goroutine 完成。使用sync.WaitGroup来实现等待。
var wg sync.WaitGroup
for x := 1; x <= 3; x++ {
wg.Add(1) // increment worker counter
go func(x int) {
defer wg.Done() // decrement on return from goroutine
worker(x, jobs, results)
}(x)
}
// Close results channel when workers are done.
go func() {
wg.Wait()
close(results)
}()
在 PlayGround 上运行这个 GoLANG 程序:https: //play.golang.org/p/GM-0Gqx0Gbg
- 2 回答
- 0 关注
- 179 浏览
添加回答
举报
