面试题答案
一键面试WaitGroup的作用
WaitGroup
是Go语言标准库sync
包中的一个类型,用于等待一组goroutine
完成工作。它提供了一种协调多个goroutine
的机制,允许主goroutine
(或其他goroutine
)等待一组goroutine
全部执行完毕后再继续执行。
WaitGroup
内部维护一个计数器,通过调用Add
方法来设置需要等待的goroutine
数量,每个goroutine
完成任务后调用Done
方法将计数器减1,主goroutine
调用Wait
方法来阻塞等待,直到计数器归零,即所有goroutine
都调用了Done
。
示例代码
package main
import (
"fmt"
"sync"
"time"
)
func worker(id int, wg *sync.WaitGroup) {
defer wg.Done()
fmt.Printf("Worker %d started\n", id)
time.Sleep(time.Second)
fmt.Printf("Worker %d finished\n", id)
}
func main() {
var wg sync.WaitGroup
numWorkers := 3
// 设置需要等待的goroutine数量
wg.Add(numWorkers)
for i := 1; i <= numWorkers; i++ {
go worker(i, &wg)
}
// 等待所有goroutine完成
wg.Wait()
fmt.Println("All workers have finished")
}
在上述代码中:
- 定义了一个
worker
函数,该函数接收一个id
和一个指向WaitGroup
的指针。在函数结束时调用wg.Done()
表示该goroutine
已完成任务。 - 在
main
函数中,创建了一个WaitGroup
实例,并通过wg.Add(numWorkers)
设置需要等待3个goroutine
。 - 使用
for
循环启动3个goroutine
,每个goroutine
执行worker
函数。 - 最后调用
wg.Wait()
阻塞主goroutine
,直到所有goroutine
都调用了Done
,即所有worker
都完成任务,然后打印All workers have finished
。