正确地使用在多个goroutine中使用waitgroup
在使用waitgroup等待goroutine执行完成的时候,遇到了这样一个问题,有很多goroutine没有执行完成,程序就退出了。
我的代码是这样的:
var (
wg *sync.WaitGroup
)
func myFunc() {
wg.Add(1)
defer wg.Done()
xxxxxxx
}
func main() {
for i:=1;i<5;i++ {
go myFunc()
}
wg.Wait()
}
经过查阅资料,发现问题出在如果将waitgroup的Add操作放在goroutine里,可能在goroutine生成并执行wg.Add操作之前,主线程就进入了wait状态,并发现没有需要等待的goroutine,因此程序退出。
于是乎,将程序改成这样,边可以顺利执行:
var (
wg sync.WaitGroup
)
func myFunc() {
defer wg.Done()
xxxxxxx
}
func main() {
for i:=1;i<5;i++ {
wg.Add(1)
go myFunc()
}
wg.Wait()
}
同时,还有一个问题值得注意,如果WaitGroup以变量方式传入,若传入的是值(副本),而非使用指针来传引用,会导致wg.Done()不能给到原本的变量上,从而导致死锁,所以在此强调在传WaitGroup变量时一定要使用指针。(当然,像上面我自己写的那样直接用全局变量也是可以的)