人们试图理解为什么下面的代码会产生一个panic: send on closed channel
该应用程序有几个阶段。生产者生成随机数并将它们发送到通道。模拟几个工人需要处理这些消息的场景,等待一秒钟,然后将它们发送到最后阶段。
func main() {
var wg sync.WaitGroup
numOfConcurrentWorkers := 2
sourceCH := make(chan int)
destCH := make(chan int)
// source stage
wg.Add(1)
go func(wg *sync.WaitGroup, out chan int) {
defer wg.Done()
data := rand.Perm(10)
for _, i := range data {
out <- i
}
close(out)
}(&wg, sourceCH)
// mid stage
wg.Add(numOfConcurrentWorkers)
for c := 0; c < numOfConcurrentWorkers; c++ {
go func(wg *sync.WaitGroup, in <-chan int, out chan int) {
defer wg.Done()
for i := range in {
time.Sleep(1 * time.Second)
out <- i
}
close(out)
}(&wg, sourceCH, destCH)
}
// final stage
wg.Add(1)
go func(wg *sync.WaitGroup, in <-chan int) {
defer wg.Done()
for i := range in {
log.Print("final ", i)
}
}(&wg, destCH)
wg.Wait()
}
神不在的星期二
ITMISS
随时随地看视频慕课网APP
相关分类