等待群組放置以實現精確計數
在並發程式設計中,sync.WaitGroup 類型充當協調 goroutine 的同步原語。它追蹤在對 wg.Wait() 進行阻塞呼叫之前需要完成的任務數。
wg.Add() 的正確放置
到為了確保準確的任務計數,在啟動隨後調用wg.Done() 的goroutine 之前調用wg.Add (1) 至關重要。這種放置保證主 Goroutine 將在 wg.Wait() 處阻塞,直到所有啟動的 Goroutine 完成。
備用放置後果
如範例程式碼所示,將wg.Add(1) 放在goroutine 中可能會導致wg.Wait() 過早完成。發生這種情況的原因是,在同一個 Goroutine 中,wg.Done() 在 wg.Add(1) 之後立即調用,導致主 Goroutine 在所有任務完成之前恢復執行。
確定性完成
當 wg.Add() 在 Goroutine 啟動之前正確放置時,主 Goroutine 在 for 循環之後才能到達 wg.Wait()。這確保了 wg.Add() 恰好被呼叫 100 次,因此 wg.Wait() 會阻塞,直到呼叫 wg.Done() 100 次。
替代方案
作為替代方案,如果事先知道循環迭代次數,則可以在循環之前呼叫 wg.Add(100)。但是,應謹慎使用此方法,因為它假設循環內沒有條件跳過。
最佳實踐
為了一致且可靠地使用sync.WaitGroup,請遵循以下準則:
以上是在 Go 的 `sync.WaitGroup` 中,應該將 `wg.Add()` 放在哪裡才能準確計數?的詳細內容。更多資訊請關注PHP中文網其他相關文章!