你的目標是利用Go 中的Goroutines 並行處理項目,收集它們的結果切成片。然而,您遇到了一個令人困惑的死鎖錯誤:「all goroutine are sleep - deadlock!」
這個錯誤源自於程式碼中的兩個問題:
為了糾正這些問題,引入一個goroutine,當工作進程關閉時異步關閉通道finish:
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 { .. }
如果您需要固定數量的工作人員以獲得最佳效率,重構代碼如下:
for i, line := range contents { wg.Add(1) go func(line string) { defer wg.Done() sampleChan <- newSample(line, *replicatePtr, *timePtr) }(line) }
這將並發原語保持在一起並簡化了各種重構並發模式。
以上是使用 Goroutines 進行平行處理和結果收集時如何避免死鎖?的詳細內容。更多資訊請關注PHP中文網其他相關文章!