Go 并行循环
我是新来的Go 并行循环,go,parallel-processing,goroutine,Go,Parallel Processing,Goroutine,我是新来的golang,我正在阅读《gopl》一书中的示例 有一个平行制作缩略图的示例: 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) //
golang
,我正在阅读《gopl》一书中的示例
有一个平行制作缩略图的示例:
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
}
func makeThumbnails6(文件名wg.Wait
将在所有工作程序goroutine完成之前不会返回。当在closer goroutine中调用wg.Wait
时,您已经调用了wg.Add(1)
为每个工作程序goroutine调用一次,因此wg.Wait
将不会返回,直到调用了相同次数的wg.Done
,并且当goroutine函数返回时会发生这种情况。因此,在所有工作程序goroutine完成它们正在执行的操作之前,关闭的goroutine不会调用close
正如您所说,理论上讲,wg
的计数器可能在创建工人的循环中达到0,但一旦循环完成,只有在所有goroutine完成后,计数器才会为0。因为在循环完成之前,您不会启动较近的goroutine,所以没有发生wg.Wait
re的危险在所有工人都完成之前转弯。不可能发生恐慌,但在我看来,你不需要这样,垃圾收集器会帮你做的