WaitGroup通过Add、Done、Wait方法实现并发任务同步,确保所有goroutine完成后再继续主程序,相比time.Sleep更可靠,比直接使用channel更简洁高效。

Golang中的
WaitGroup
要使用
WaitGroup
Add(delta int)
Done()
Wait()
sync.WaitGroup
wg.Add(1)
go
Wait()
wg.Done()
defer wg.Done()
wg.Wait()
WaitGroup
这是一个典型的使用示例:
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.Duration(id) * time.Second) // 模拟耗时操作
fmt.Printf("Worker %d finished.\n", id)
}
func main() {
var wg sync.WaitGroup
numWorkers := 3
fmt.Println("Main: Starting workers...")
for i := 1; i <= numWorkers; i++ {
wg.Add(1) // 启动前增加计数
go worker(i, &wg)
}
fmt.Println("Main: Waiting for workers to complete...")
wg.Wait() // 阻塞直到所有worker完成
fmt.Println("Main: All workers completed. Exiting.")
}在我刚接触Go并发编程的时候,也曾天真地尝试过
time.Sleep()
time.Sleep(那个估摸的时间)
立即学习“go语言免费学习笔记(深入)”;
Sleep
Sleep
time.Sleep()
至于
channel
channel
你可能需要为每个goroutine创建一个
chan struct{}chan bool
WaitGroup
WaitGroup
WaitGroup
Add(delta int)
WaitGroup
delta
WaitGroup
delta
Add()
go worker()
wg.Add(1)
Add()
worker
Add()
Done()
WaitGroup
Wait()
wg.Add(1)
go func() { ... }()Done()
WaitGroup
Add(-1)
WaitGroup
Add()
Done()
Done()
defer
WaitGroup
wg.Wait()
defer wg.Done()
Done()
Done()
WaitGroup
Add()
Wait()
WaitGroup
Add()
Done()
Wait()
Wait()
Wait()
在实际的Go项目中,并发场景往往比简单的“等待所有任务完成”要复杂得多。这时,
WaitGroup
context.Context
context
context.WithCancel
context
WaitGroup
context
sync.Mutex
sync.RWMutex
sync.Mutex
sync.RWMutex
channel
channel
channel
channel
在我看来,构建一个复杂的并发系统,往往是这些原语的组合拳。
WaitGroup
context
Mutex
channel
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号