首頁  >  文章  >  後端開發  >  在 Go 的 `sync.WaitGroup` 中,應該將 `wg.Add()` 放在哪裡才能準確計數?

在 Go 的 `sync.WaitGroup` 中,應該將 `wg.Add()` 放在哪裡才能準確計數?

Linda Hamilton
Linda Hamilton原創
2024-10-28 07:15:30106瀏覽

  Where Should You Place `wg.Add()` for Accurate Counting in Go's `sync.WaitGroup`?

等待群組放置以實現精確計數

在並發程式設計中,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,請遵循以下準則:

  1. 在開始新的Goroutine之前在主Goroutine 中呼叫wg.Add()。
  2. 在 Goroutine 中延遲呼叫 wg.Done() 以確保完成,即使在
  3. 在函數之間共用 WaitGroup 時,將指標傳遞給 WaitGroup 以避免複製。

以上是在 Go 的 `sync.WaitGroup` 中,應該將 `wg.Add()` 放在哪裡才能準確計數?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn