版权声明:版权声明:本文为博主原创文章,转载请附上博文链接! https://blog.csdn.net/weixin_43851310/article/details/87889804
sync包提供了基本的同步基元.本包的类型的值不应被拷贝。
go中对同步,异步的概念:
同步:一边写,一边读;异步:听课,司机开车
sync.WaitGroup
type WaitGroup struct { // 包含隐藏或非导出字段 }
WaitGroup用于等待一组线程的结束。父线程调用Add方法来设定应等待的线程的数量。每个被等待的线程在结束时应调用Done方法。同时,主线程里可以调用Wait方法阻塞至所有线程结束。
Add方法 创建计数器
func (wg *WaitGroup) Add(delta int)
Add方法向内部计数加上delta,delta可以是负数;如果内部计数器变为0,Wait方法阻塞等待的所有线程都会释放,如果计数器小于0,方法panic。注意Add加上正数的调用应在Wait之前,否则Wait可能只会等待很少的线程。一般来说本方法应在创建新的线程或者其他应等待的事件之前调用。
Done方法 减少WaitGroup计数器的值,应在线程的最后执行
func (wg *WaitGroup) Done()
Done方法减少WaitGroup计数器的值,应在线程的最后执行
Wait方法 阻塞直到WaitGroup计数器减为0。
func (wg *WaitGroup) Wait()
Wait方法阻塞直到WaitGroup计数器减为0。
场景: 运用多go程输出1-9
func main() {
c:=make(chan bool)
for i:=1;i<10 ;i++ {
go setValue(c,i) //启动9个go程,执行程序
}
for i:=1;i<10 ;i++ {
<-c
}
}
func setValue(c chan bool,i int){
fmt.Println(i)
c<-true
}
结果:1-9打印的顺序是无序的,但是1-9全都可以打印出来
也可以通过任务组的方式实现上面的效果:
func main() {
wg:=sync.WaitGroup{} //创建任务组
wg.Add(9) //在组中添加9个任务
for i:=1;i<10 ;i++ {
go setValue(&wg,i)
}
wg.Wait() //等待任务组中任务全部执行外部
}
func setValue(wg *sync.WaitGroup,i int){
fmt.Println(i)
wg.Done() //完成任务,在任务组中减1
}
Output:
9
4
6
1
5
7
8
2
3