携手创造,一起成长!这是我参加「日新计划 8 月更文应战」的第30天,点击检查活动概况
sync.WaitGroup结构体目标
在Go言语中,sync.WaitGroup结构体目标用于等候一组线程的结束;WaitGroup是go并发中最常用的东西,咱们可以经过WaitGroup来表达这一组协程的任务是否完结,以决定是否持续往下走,或许取任务结果;
WaitGroup的结构体
结构如下所示:
type WaitGroup struct { noCopy noCopy state1 [3]uint32 }
在sync.WaitGroup结构体目标中有三个办法,Add()、Done()、Wait()
Add()办法
首要为WaitGroup的等候数+1或许+n;
Add()办法的界说如下:
func(*WaitGroup) Add()
- Add()办法内部计数器加上delta,delta可以是负数;
- 假如内部计数器变为0,则Wait()办法会将处于堵塞等候的所有goroutine开释;
- 假如计数器小于0,则调用panic()函数;
- Add()办法加上正数的调用应在Wait()办法之前,否则Wait()办法可能只会等候很少的goroutine;
- Add()办法在创建新的goroutine或许其它等候的事情之前调用;
Done()办法
Done函数调用的也是Add函数,首要用于-1操作;
Done()办法的界说如下:
func(wg *WaitGroup) Done()
- Done()办法会削减WaitGroup计数器的值,一般在goroutine的最终履行;
Wait()办法
堵塞当前协程,直到等候数归为0才持续向下履行;
Wait()办法的界说如下:
func (wg *WaitGroup) Wait()
Wait()办法会堵塞,知道WaitGroup计数器减为0.
Add()、Done()、Wait()三者对比
- 在三个办法中,运用Add()办法增加计数,运用Done()办法减掉一个计数,假如计数不为0,则会堵塞Wait()办法的运转;
- 一个goroutine调用Add()办法来设定等候的goroutine的数量;
- 每个被等候的goroutine在结束时调用Done()办法;
- 在主goroutine里可以调用Wait()办法堵塞至所有goroutine结束;
sync.WaitGroup运用示例
运用sync.WaitGroup等候goroutine结束的示例如下图所示: