示例
这里我们直接来用代码进行讲解,以下面的代码为例我们需要等待协程结束后查询count的,所以最后在末尾处使用了睡眠time.Sleep(time.Second* 2)
,目前的是一个简单的业务逻辑我们可以使用睡眠来等待,但是如果遇到业务复杂的情况,时间是无法进行预料的,这样的方法就不能使用了,
func main(){
count := 0
for i:=0 ;i<10000;i {
go func() {
//数据处理
count
}()
}
time.Sleep(time.Second* 2)
fmt.Println(count)
}
这里我们可以使用WaitGroup来对代码进行优化
Sync.WaitGroup
简单使用就是在创建一个任务的时候wg.Add(1), 任务完成的时候使用wg.Done()来将任务减一。使用wg.Wait()来阻塞等待所有任务完成。
代码语言:javascript复制func main(){
wg:= sync.WaitGroup{}
count := 0
for i:=0 ;i<10000;i {
wg.Add(1)
go func() {
defer wg.Done()
count
}()
}
wg.Wait()
fmt.Println(count)
}
代码使用WaitGroup,这样就无需通过估算时间睡眠这种方式,等待协程的结束,也可以这样写,如下:
代码语言:javascript复制func main(){
wg:= sync.WaitGroup{}
count := 0
wg.Add(10000)
for i:=0 ;i<10000;i {
go func() {
defer wg.Done()
count
}()
}
wg.Wait()
fmt.Println(count)
}
WaitGroup 对象内部有一个计数器,最初从0开始,它有三个方法:Add(), Done(), Wait() 用来控制计数器的数量。Add(n) 把计数器设置为n ,Done() 每次把计数器-1 ,wait() 会阻塞代码的运行,直到计数器地值减为0。