在並發程式設計中,控制同時執行的 goroutine 數量至關重要。一種方法是使用緩衝通道作為信號量。然而,在等待信號量完全耗盡時會出現一個常見問題。
假設我們有一個整數切片要同時處理,限制為兩個並發去例行公事。我們使用緩衝通道作為信號量來強制執行此限制。雖然程式碼適用於大多數整數,但由於緩衝區永遠不會達到空,程式在最後一個 go 例程完成之前提前退出。
我們如何等待緩衝通道完全排空,確保所有 go 程式在程式退出之前完成?
使用通道由於缺乏無競爭的方法來檢查其長度,等待特定條件是不可行的。相反,我們可以使用sync.WaitGroup來監控所有goroutines的完成。
sem := make(chan struct{}, 2) var wg sync.WaitGroup for _, i := range ints { wg.Add(1) // acquire semaphore sem <- struct{}{} // start long running go routine go func(id int) { defer wg.Done() // do something // release semaphore <-sem }(i) } wg.Wait()
透過使用sync.WaitGroup,我們可以等待所有goroutine完成之前程式退出,確保所有處理完成。
以上是使用緩衝通道作為信號量時如何確保所有 Goroutines 完成?的詳細內容。更多資訊請關注PHP中文網其他相關文章!