面试题答案
一键面试WaitGroup使用场景
在Go语言中,WaitGroup
主要用于协调多个Goroutine,使得主Goroutine(或其他Goroutine)能够等待一组Goroutine全部完成工作后再继续执行。常用于以下场景:
- 并发任务处理:当需要同时启动多个Goroutine执行不同任务,并且要在所有任务完成后进行后续操作时,例如批量数据处理、并行I/O操作等。
- 服务启动与关闭:在启动多个服务组件(每个组件在独立的Goroutine中运行)时,等待所有组件启动完成;或者在关闭服务时,等待所有正在运行的Goroutine完成清理工作。
示例代码
package main
import (
"fmt"
"sync"
)
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
numWorkers := 3
for i := 1; i <= numWorkers; i++ {
wg.Add(1)
go worker(i, &wg)
}
fmt.Println("Waiting for all workers to finish...")
wg.Wait()
fmt.Println("All workers have finished.")
}
在上述代码中:
worker
函数是一个在Goroutine中执行的函数,它接收一个id
和*sync.WaitGroup
指针。在函数结束时调用wg.Done()
,表示该Goroutine的工作已经完成。- 在
main
函数中,初始化了一个WaitGroup
。通过循环启动了numWorkers
个Goroutine,每个Goroutine启动前调用wg.Add(1)
,表示有一个新的任务需要等待。 - 调用
wg.Wait()
,main
函数会阻塞在这里,直到所有Goroutine都调用了wg.Done()
,即所有任务完成,然后继续执行后续代码。