gpt4 book ai didi

go - 并行循环

转载 作者:IT王子 更新时间:2023-10-29 01:01:17 26 4
gpt4 key购买 nike

我是 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
}

我的疑问是,是否有可能在处理所有文件之前,closer 通过 wg.Wait()

例如,如果 work1 完成它的工作并将 wg 减少到零,然后一些神奇的调度发生并且 close 获得运行和关闭的时间 channel ?

感谢任何帮助!

最佳答案

wg.Wait 在所有 worker goroutine 完成之前不会返回。当 wg.Wait 在 closer goroutine 中被调用时,你已经为每个 worker goroutine 调用了一次 wg.Add(1),所以 wg.Wait 直到 wg.Done 被调用相同次数后才会返回,这发生在 goroutine 函数返回时。因此,在所有 worker goroutine 完成他们正在做的事情之前,closer goroutine 不会调用 close

正如您所说,理论上 wg 的计数器可能会在创建 worker 的循环中达到 0,但是一旦循环结束,计数器将只有一次为 0 goroutines 已经完成。由于在循环完成之前您不会启动 closer goroutine,因此不存在 wg.Wait 在所有 worker 完成之前返回的危险。

关于go - 并行循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51006918/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com