等待緩衝通道耗盡
在提供的程式碼中,緩衝通道用作信號量來限制並發數量運行 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中文網其他相關文章!