Golang 中使用WaitGroup的那点坑

       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内,不会导致主线程的阻塞,同样可以实现同步的效果。

 

 

你可能感兴趣的:(GO)