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

被折叠的 条评论
为什么被折叠?



