Go語言同步等待組sync.WaitGroup結構體對象方法詳解
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結束的示例如下圖所示:
以上就是Go語言同步等待組sync.WaitGroup結構體對象方法詳解的詳細內容,更多關於Go sync.WaitGroup結構體的資料請關註WalkonNet其它相關文章!
推薦閱讀:
- Go語言學習之WaitGroup用法詳解
- Go並發控制WaitGroup的使用場景分析
- Go WaitGroup及Cond底層實現原理
- 在golang中使用Sync.WaitGroup解決等待的問題
- golang基礎之waitgroup用法以及使用要點