在并发过程中,往往需要用一种方式,来通知别的协程,自身任务已经完成, 比如协程A发送10个消息后,告诉协程B,我已经发完了。对于go来说,想实现有三种方式
- 主动等待一段时间,比如等个1s,1s后就默认已经发完(实际可能并没有完成)
- 利用无缓冲channel
- 利用sync.WaitGroup
这里主要将第三种,涉及的方法如下
var group sync.WaitGroup
// 添加10个任务,数量根据自身需要改
group.ADD(10)
// 任务数减一,或者完成任务数+1
group.Done()
// 等待10个任务全部结束,不然就一直阻塞
group.Wait()
下面是例子
package main
import (
"fmt"
"sync"
)
func producer(group *sync.WaitGroup){
for i:=0;i<Len;i++{
c<-i
fmt.Println("Produce i:",i)
group.Done()
}
}
const Len = 10
var c =make(chan int,Len)
func main(){
var group sync.WaitGroup
group.Add(Len)
go producer(&group)
go consumer(&group)
group.Wait()
}
func consumer(group *sync.WaitGroup){
for v:=range c{
fmt.Println("Consumer get ",v)
}
}