发布时间:2024-12-23 03:46:47
在golang中,sync.WaitGroup是一个非常有用的工具,它可以用来控制并发执行的goroutine。当我们需要等待一组goroutine完成后再继续执行其他操作时,sync.WaitGroup就派上了用场。
首先,让我们了解一下sync.WaitGroup的基本用法。
要使用sync.WaitGroup,我们首先需要创建一个WaitGroup对象:
var wg sync.WaitGroup
然后,我们可以通过调用Add方法来增加等待的goroutine数量:
wg.Add(1)
接下来,我们在每个goroutine的结尾调用Done方法来通知WaitGroup一个goroutine已经完成:
go func() {
defer wg.Done()
// 执行具体的任务
}()
最后,我们可以通过调用Wait方法来等待所有的goroutine完成:
wg.Wait()
假设我们有一个需求,需要从多个URL下载图片并保存到本地。我们希望能够同时下载多张图片,但是希望只有所有的图片都下载完毕后才继续执行后面的逻辑。
package main
import (
"io"
"net/http"
"os"
"sync"
)
func main() {
urls := []string{
"https://example.com/1.jpg",
"https://example.com/2.jpg",
"https://example.com/3.jpg",
}
var wg sync.WaitGroup
for _, url := range urls {
wg.Add(1)
go func(url string) {
defer wg.Done()
resp, err := http.Get(url)
if err != nil {
// 处理错误
return
}
defer resp.Body.Close()
file, err := os.Create(url[strings.LastIndex(url, "/")+1:])
if err != nil {
// 处理错误
return
}
defer file.Close()
_, err = io.Copy(file, resp.Body)
if err != nil {
// 处理错误
return
}
}(url)
}
wg.Wait()
// 所有图片已经下载完毕,可以继续执行后面的逻辑
}
在上面的示例中,我们创建了一个WaitGroup对象,并通过调用Add方法来增加等待的goroutine数量。然后,在每个goroutine下载图片完成后调用Done方法通知WaitGroup一个goroutine已经完成。最后,我们调用Wait方法等待所有的goroutine完成。
总结起来,sync.WaitGroup是golang中非常方便的并发控制工具,它可以帮助我们实现等待一组goroutine完成后再继续执行其他操作。通过合理使用sync.WaitGroup,我们可以更好地控制并发执行的goroutine,提高程序的性能和效率。