WaitGroup介绍
sync包的WaitGroup类型可以实现一对多的goroutine的协助流程。
WaitGroup类型拥有三个指针方法:Add、Done和Wait。可以类比为一个计数器,默认值是0,可以通过调用方法来增加或者减少
WaitGroup类型的Done方法,用于对其所属值中计数器的值进行减一操作。我们可以在需要等待的 goroutine 中,通过defer语句调用它。而此类型的Wait方法的功能是,阻塞当前的 goroutine,直到其所属值中的计数器归零。如果在该方法被调用的时候,那个计数器的值就是0,那么它将不会做任何事情。
package test
import (
"fmt"
"sync"
"testing"
"time"
)
func TestWaitGroup(t *testing.T) {
var wg sync.WaitGroup
for i := 0; i < 3; i++ {
wg.Add(1)
go process(i, &wg)
}
wg.Wait()
fmt.Println("All End")
}
func process(i int, wg *sync.WaitGroup) {
fmt.Printf("Start Process %d \n", i)
time.Sleep(2 * time.Second)
fmt.Printf("End Process %d \n", i)
wg.Done()
}
=== RUN TestWaitGroup
Start Process 2
Start Process 1
Start Process 0
End Process 0
End Process 2
End Process 1
All End
--- PASS: TestWaitGroup (2.00s)
PASS