为了等待多个 goroutines 完成,我们可以使用 WaitGroup。
package main
import (
"fmt"
"sync"
"time"
)
// 这是我们将在每个 goroutine 中运行的函数。
func worker(id int) {
fmt.Printf("Worker %d starting\n", id)
// 通过睡眠来模拟一个耗时的任务。
time.Sleep(time.Second)
fmt.Printf("Worker %d done\n", id)
}
func main() {
// 这个 WaitGroup 用于等待这里启动的所有 goroutines 完成。注意:如果 WaitGroup 被显式传递到函数中,它应该通过指针传递。
var wg sync.WaitGroup
// 启动多个 goroutines,并为每个 goroutine 增加 WaitGroup 的计数器。
for i := 1; i <= 5; i++ {
wg.Add(1)
// 将 worker 调用包装在一个闭包中,确保在 worker 完成时通知 WaitGroup。这样,worker 本身就不需要关心其执行过程中涉及的并发原语。
go func() {
defer wg.Done()
worker(i)
}()
}
// 阻塞直到 WaitGroup 计数器回到 0;所有 worker 都已通知它们完成。
wg.Wait()
// 请注意,这种方法没有直接的方式来传播 worker 的错误。对于更复杂的用例,可以考虑使用 errgroup 包。
}运行结果:
$ go run waitgroups.go
Worker 5 starting
Worker 3 starting
Worker 4 starting
Worker 1 starting
Worker 2 starting
Worker 4 done
Worker 1 done
Worker 2 done
Worker 5 done
Worker 3 done原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。