將Goroutines 的結果收集到切片中
利用Goroutine 並發處理資料並收集結果可能具有挑戰性,特別是在管理並發和線程時安全。在您的程式碼中,您遇到了死鎖錯誤,因為 waitgroup 收到訊號,要求等待所有 goroutine 完成後再收集結果。
要解決此問題,我們需要在所有 goroutine 完成後非同步關閉結果通道他們的任務。這是程式碼的修改版本:
for i, line := range contents { wg.Add(1) go newSample(line, *replicatePtr, *timePtr, sampleChan, &wg) } go func() { wg.Wait() close(sampleChan) }() for s := range sampleChan { // Process results }
此變更可確保當所有 goroutine 完成時關閉結果通道,使我們能夠正確收集結果。
此外,為了增強為了程式碼清晰性和可測試性,建議將 newSample 重構為產生結果的同步函數,而不是採用 waitgroup 和通道。這可以更清晰地分離並發問題並簡化測試。
透過實作這些調整,您可以有效地從 Goroutine 收集結果並避免死鎖錯誤。
以上是將 Goroutines 的結果收集到切片中時如何避免死鎖?的詳細內容。更多資訊請關注PHP中文網其他相關文章!