简介: 当某个请求同时开启多个任务时,为了保证在请求关闭前任务都能正常完成,可以利用
sync同步包里的方法来实现。
| 方法 | 说明 |
|---|---|
| (wg * WaitGroup) Add(delta int) | 计数器+delta |
| (wg *WaitGroup) Done() | 计数器-1 |
| (wg *WaitGroup) Wait() | 阻塞直到计数器变为0 |
代码:
package main
import (
"fmt"
"sync"
)
var wg sync.WaitGroup
func echoHello() {
defer wg.Done() //减少计数器
fmt.Println("hello world!")
}
func main() {
n := 4
wg.Add(n) //设置计数器
for i := 1; i <= n; i++ {
go echoHello() // 启动另外一个goroutine去执行echoHello函数
}
wg.Wait() //等待计数器为0 (任务完成时)
fmt.Println("main goroutine done!")
}
结果:
hello world!
hello world!
hello world!
hello world!
main goroutine done!
说明:sync.WaitGroup内部维护着一个计数器,计数器的值可以增加和减少。例如当我们启动了n个并发任务时,就将计数器值增加n。每个任务完成时通过调用Done()方法将计数器减1。通过调用Wait()来等待并发任务执行完,当计数器值为0时,表示所有并发任务已经完成。