首頁 >後端開發 >Golang >使用緩衝通道作為信號量時如何確保所有 Goroutines 完成?

使用緩衝通道作為信號量時如何確保所有 Goroutines 完成?

Mary-Kate Olsen
Mary-Kate Olsen原創
2024-11-29 06:27:12358瀏覽

How to Ensure All Goroutines Complete When Using a Buffered Channel as a Semaphore?

等待空緩衝通道(信號量)

在並發程式設計中,控制同時執行的 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中文網其他相關文章!

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