sync.WaitGroup用于等待多个goroutine完成,通过Add增计数、Done减计数、Wait阻塞等待归零;示例中启动3个worker并发执行并同步等待结束。

在Golang中,sync.WaitGroup 是用于等待一组并发的goroutine完成执行的常用同步原语。它特别适用于你启动多个协程并希望主线程阻塞直到它们全部结束的场景。使用 WaitGroup 可以避免程序过早退出,也能确保所有任务都处理完毕。
WaitGroup 内部维护一个计数器,调用 Add(n) 增加计数,每个任务完成后调用 Done() 减少计数,而 Wait() 会阻塞当前协程,直到计数器归零。
基本使用步骤如下:
下面是一个使用 WaitGroup 控制三个并发任务的例子:
立即学习“go语言免费学习笔记(深入)”;
package main
import (
"fmt"
"sync"
"time"
)
func worker(id int, wg *sync.WaitGroup) {
defer wg.Done() // 任务完成时通知
fmt.Printf("Worker %d starting\n", id)
time.Sleep(time.Second) // 模拟耗时操作
fmt.Printf("Worker %d done\n", id)
}
func main() {
var wg sync.WaitGroup
for i := 1; i <= 3; i++ {
wg.Add(1) // 每次启动一个协程就加1
go worker(i, &wg)
}
wg.Wait() // 阻塞直到所有 Done 被调用
fmt.Println("All workers finished")
}
输出结果类似:
Worker 1 starting Worker 2 starting Worker 3 starting Worker 1 done Worker 2 done Worker 3 done All workers finished
使用 WaitGroup 时需注意以下几点,避免出现死锁或 panic:
WaitGroup 常用于以下场景:
例如,批量请求数据:
urls := []string{"http://example.com", "http://google.com", "http://github.com"}
var wg sync.WaitGroup
for _, url := range urls {
wg.Add(1)
go func(u string) {
defer wg.Done()
resp, err := http.Get(u)
if err != nil {
fmt.Printf("Error: %s\n", err)
return
}
fmt.Printf("Status from %s: %s\n", u, resp.Status)
resp.Body.Close()
}(url)
}
wg.Wait()
fmt.Println("All requests completed")
基本上就这些。WaitGroup 是轻量且高效的并发控制工具,掌握它的正确用法对编写可靠的并发程序至关重要。只要注意调用时机和计数匹配,就能安全地协调多个 goroutine。不复杂但容易忽略细节。
以上就是如何在Golang中使用sync.WaitGroup等待并发完成_Golang WaitGroup并发控制的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号