Golang中的同步工具sync.WaitGroup詳解
sync.WaitGroup
sync.WaitGroup作用是等待一組goroutine執(zhí)行完成,當使用多個goroutine處理任務的時候,如果要等待所有的goroutine都執(zhí)行完成后再執(zhí)行下一步操作,就可以使用sync.WaitGroup來實現(xiàn)。
sync.WaitGroup有三個方法:
- Add(delta int):增加或減少等待goroutine的數(shù)量,delta可以為負數(shù);
- Done():標記goroutine已執(zhí)行完成,等價于Add(-1);
- Wait():等待所有的goroutine執(zhí)行完成。
使用方法和示例
假如有n個任務需要處理,可以先創(chuàng)建一個WaitGroup,用于等待所有的任務完成:
var wg sync.WaitGroup
在處理每一個任務之前,調用一次Add方法:
wg.Add(1)
在每一個任務處理完成之后,調用一次Done方法:
wg.Done()
最后,在等待所有的任務完成之前,需要調用一次Wait方法:
wg.Wait()
具體示例代碼如下:
package main import ( "log" "sync" "time" ) func main() { // 創(chuàng)建一個等待組 var wg sync.WaitGroup for i := 1; i <= 5; i++ { // 每一個任務開始前, 增加1 wg.Add(1) go func(index int) { // 處理業(yè)務邏輯 //... time.Sleep(1 * time.Second) log.Printf("第 %d 個goroutine執(zhí)行完了", index) wg.Done() }(i) } // 等待所有的任務完成 wg.Wait() log.Println("所有goroutine都執(zhí)行完了") }
使用過程中需要注意的點
Done和Add方法的順序非常重要,Done方法必須在goroutine最后執(zhí)行,否則可能會導致計數(shù)器無法正確的達到0;
如果使用Add或Done方法將wg維護的計數(shù)更改成了負數(shù)會導致panic;
Wait方法會一直阻塞,直到所有的goroutine都執(zhí)行完成為止(wg維護的計數(shù)達到0),因此在使用時需要小心;
sync.WaitGroup是開箱即用的,并且是并發(fā)安全的。
到此這篇關于Golang中的同步工具sync.WaitGroup詳解的文章就介紹到這了,更多相關Golang同步工具sync.WaitGroup內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!