sync.WaitGroup对于Golang开发者来说并不陌生,其经常作为多协程之间同步的一种机制。用好它势必会让你事半功倍,但是一旦错用将引发问题。关于WaitGroup的使用网上有很多例子,在此就不做介绍了,我想说的是我在项目中使用WaitGroup遇到的坑。
在项目中,因为服务器有同步需求, 所以直接使用了WaitGroup,但是未考虑使用场景,结果在项目上线之后,高峰期的时候客户端经常出现卡顿,经过多方查找,才发现如果使用WaitGroup的时候,未启动单独的goroutine,那么极有可能造成主线程的阻塞,所以我做了下面的测试(测试中,我把WaitGroup置于协程内):
func main() {
fmt.Println("main-1")
testchan()
fmt.Println("main-2")
}
func testchan() {
fmt.Println("testchan-1")
go func() {
var wg *sync.WaitGroup = new(sync.WaitGroup)
fmt.Println("testchan-2")
testchan1(wg)
fmt.Println("testchan-5")
wg.Wait()
time.Sleep(time.Duration(5) * time.Second)
fmt.Println("testchan-6")
}()
}
func testchan1(wg *sync.WaitGroup) {
wg.Add(1)
fmt.Println("testchan-3")
time.Sleep(time.Duration(5) * time.Second)
fmt.Println("testchan-4")
wg.Done()
}
输出为:
main-1
testchan-1
main-2
testchan-2
testchan-3
// 5秒后
testchan-4
testchan-5
// 再过5秒
testchan-6
总结:将WaitGroup用于goroutine内,不会导致主线程的阻塞,同样可以实现同步的效果。
来源:CSDN
作者:he_silong
链接:https://blog.csdn.net/he_silong/article/details/82459868