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的危险在所有工人都完成之前转弯。

不可能发生恐慌,但在我看来,你不需要这样,垃圾收集器会帮你做的