答案
sync.WaitGroup
是Go语言中用于等待一组goroutine完成的同步机制。它提供了一种简单的方法来确保主goroutine等待所有其他goroutine完成执行后再继续。
工作原理:
Add(delta int): 增加WaitGroup的计数器。
delta
可以是正数、负数或零。通常在启动新的goroutine之前调用Add
。Done(): 减少WaitGroup的计数器。通常在goroutine执行结束时调用。
Wait(): 阻塞直到WaitGroup的计数器变为零。通常在主goroutine中调用,确保所有goroutine完成后再继续执行。
使用示例:
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)
go worker(i, &wg)
}
wg.Wait()
fmt.Println("All workers done")
}
常见错误:
忘记调用
Done()
: 如果在goroutine中忘记调用Done()
,会导致Wait()
永远阻塞。不正确的
Add()
调用: 在启动goroutine之后调用Add()
可能导致计数错误,应该在启动goroutine之前调用。使用值传递
WaitGroup
:WaitGroup
应通过指针传递,否则每个goroutine会有自己的副本,导致计数错误。
开放性后续问题:
如果我们需要在程序中处理错误或者超时,该如何扩展sync.WaitGroup
的使用?请描述一种实现策略。
评分标准:
基础理解: 候选人能够正确解释
sync.WaitGroup
的基本概念和方法。代码示例: 提供的代码示例能够正确演示
sync.WaitGroup
的使用,并且没有明显错误。错误识别: 能够识别并解释常见的使用错误。
进阶思考: 能够提出合理的扩展策略,如处理错误或超时的方案。
沟通能力: 能够清晰地表达思路和解释代码逻辑。