为了账号安全,请及时绑定邮箱和手机立即绑定

Golang - 带有通道和等待组的管道,发送关闭通道恐慌错误

Golang - 带有通道和等待组的管道,发送关闭通道恐慌错误

Go
神不在的星期二 2022-07-11 16:50:55
人们试图理解为什么下面的代码会产生一个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()}
查看完整描述

1 回答

?
ITMISS

TA贡献1871条经验 获得超8个赞

在中间阶段,每个 goroutine 都在关闭共享输出通道,所以当第一个 goroutine 关闭它时,所有其他尝试写入它的 goroutine 都会失败。

当所有中期工作人员完成时关闭它。为此使用单独的等待组。


查看完整回答
反对 回复 2022-07-11
  • 1 回答
  • 0 关注
  • 146 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号