并发进程同步工具-WaitGroup
使用等待组进行多个任务的同步,等待组可以保证在并发环境中完成指定数量的任务
等待组的方法:
方法名 | 功能 |
---|---|
(wg *WaitGroup)Add(delta int) | 等待组的计数器+1 |
(wg *WaitGroup)Done() | 等待组的计数器-1 |
(wg *WaitGroup)Wait() | 当等待组计数器不等于0时阻塞,直到为0 |
以下代码实现了主协程与两个子协程,两者之间的同步
package main
import (
"fmt"
"sync"
)
var wg sync.WaitGroup
func main(){
/*
WaitGroup :同步等待组
Add(),设置等待组中要执行的子goroutine的数量
Wait(),让主goroutine处于等待
Done(),等待组计数器减-1
注意,如果Add中的值最后减不到0,那么程序就会引发panic(恐慌)
*/
wg.Add(2)
go fun1()
go fun2()
fmt.Println("main 进入阻塞状态,等待wg中的子goroutine结束。")
wg.Wait()
fmt.Println("main 解除阻塞")
}
func fun1(){
for i:=1;i<10;i++{
fmt.Println("fun1()函数中打印。。。A",i)
}
wg.Done()
}
func fun2(){
defer wg.Done()
for i:=1;i<10;i++{
fmt.Println("fun2()函数中打印。。。B",i)
}
}
控制台输出:
main 进入阻塞状态,等待wg中的子goroutine结束。
fun2()函数中打印。。。B 1
fun1()函数中打印。。。A 1
fun1()函数中打印。。。A 2
fun1()函数中打印。。。A 3
fun1()函数中打印。。。A 4
fun1()函数中打印。。。A 5
fun1()函数中打印。。。A 6
fun1()函数中打印。。。A 7
fun1()函数中打印。。。A 8
fun1()函数中打印。。。A 9
fun2()函数中打印。。。B 2
fun2()函数中打印。。。B 3
fun2()函数中打印。。。B 4
fun2()函数中打印。。。B 5
fun2()函数中打印。。。B 6
fun2()函数中打印。。。B 7
fun2()函数中打印。。。B 8
fun2()函数中打印。。。B 9
main 解除阻塞
注意,主线程执行第一条打印语句之后进入阻塞状态,等待等待组内的子协程执行完毕,之后又恢复主线程打印了主线程解除阻塞,程序结束。通过整个流程和打印结果我们可以看出,等待组实现了组与组之间的同步,组内之间仍然是交替抢占CPU时间片的。