前言
在go中,如果使用go跑异步的话,会发现,当main函数执行完时,go修饰的方法也跟着结束了,所以go提供了sync.WaitGroup来实现等待唤醒
方法说明
sync.WaitGroup提供了Add,Done,Wait等几个方法,add方法用于往计数器+1,Done类似于计数-1,wait()用于等待计数器变为0才往下执行
go关键字修饰方法
package main
import (
"fmt"
"time"
)
func main() {
go say()
fmt.Println(13)
}
func say() {
time.Sleep(5 * time.Second)
fmt.Println(12)
}
这段程序会发发现,当main方法执行结束时,say()方法就不执行了,也就是不输出了,但是如果要让方法输出的话,可以使用休眠,程序如下
package main
import (
"fmt"
"time"
)
func main() {
go say()
fmt.Println(13)
}
func say() {
time.Sleep(5 * time.Second)
fmt.Println(12)
}
但是总不可能使用休眠的方法使方法输出
sync.WaitGroup使用
package main
import (
"fmt"
"sync"
"time"
)
var wg sync.WaitGroup
func main() {
wg.Add(1)
go say()
wg.Wait()
fmt.Println("执行结束")
}
func say() {
defer wg.Done()
fmt.Println(12)
time.Sleep(5 * time.Second)
fmt.Println(14)
}
总结
sync.WaitGroup可以实现异步方法的等待唤醒,通过调用Wait()来等待并发任务执行完,当计数器值为0时,表示所有并发任务已经完成。