首頁 > 後端開發 > Golang > 使用緩衝通道作為信號量時,如何確保所有 Goroutine 在程式退出之前完成?

使用緩衝通道作為信號量時,如何確保所有 Goroutine 在程式退出之前完成?

Linda Hamilton
發布: 2024-12-30 10:09:11
原創
498 人瀏覽過

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

等待緩衝通道耗盡

在提供的程式碼中,緩衝通道用作信號量來限制並發數量運行 goroutine。然而,如果沒有明確的機制來等待通道耗盡,主程式可能會在所有 goroutine 執行完畢之前終止。

問題:

如何確保程式會等待所有 goroutine 完成前退出?

答案:

為此目的使用信號量(通道)並不理想,因為沒有內建方法來檢查通道的長度並等待它達到 0。要正確等待goroutine 完成,請考慮使用同步原語,例如sync.WaitGroup.

更新的代碼:

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) 。這允許主程式等待所有任務完成。 wg.Add(1) 在啟動新的 goroutine 之前增加任務計數,而 wg.Done() 在 goroutine 完成時減少計數。 wg.Wait() 呼叫會阻塞主程序,直到任務計數達到 0,確保所有 goroutine 在程序退出之前都已完成。

以上是使用緩衝通道作為信號量時,如何確保所有 Goroutine 在程式退出之前完成?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板