gopl 8.5章节wg.Wait()为什么要放在goroutine内部

博客探讨了在Go并发编程中,为什么wg.Wait()通常需要放在goroutine内部。通过分析当wg.Wait()置于主协程不同位置时,程序可能遇到的阻塞和无限循环问题,强调了正确使用waitgroup以确保goroutine同步的重要性。

wg.Wait()在goroutine内部

// makeThumbnails6 makes thumbnails for each file received from the channel.
// It returns the number of bytes occupied by the files it creates.
func makeThumbnails6(filenames <-chan string) int64 {
    sizes := make(chan int64)
    var wg sync.WaitGroup // number of working goroutines
    for f := range filenames {
        wg.Add(1)
        // worker
        go func(f string) {
            defer wg.Done()
            thumb, err := thumbnail.ImageFile(f)
            if err != nil {
                log.Println(err)
                return
            }
            info, _ := os.Stat(thumb) // OK to ignore error
            sizes <- info.Size()
        }(f)
    }

    // closer
    go func() {
        wg.Wait()
        close(sizes)
    }()

    var total int64
    for size := range sizes {
        total += size
    }
    return total
}

这里wg.Wait()为什么要放在goroutine内部?

如果wg.Wait()放在主协程
位置在for size := range sizes前面时,由于sizes是unbuffered channel, 所有的worker goroutine将会阻塞,wg.Done()不会执行到

位置在for size := range sizes后面时,由于没有关闭sizes channel,for size := range sizes将会一直取到数据,是个无限循环

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值