首頁 > 後端開發 > Golang > 使用 Goroutines 進行平行處理和結果收集時如何避免死鎖?

使用 Goroutines 進行平行處理和結果收集時如何避免死鎖?

Barbara Streisand
發布: 2024-11-07 02:09:03
原創
580 人瀏覽過

How to Avoid Deadlocks When Using Goroutines for Parallel Processing and Result Gathering?

了解並行處理和結果收集的Goroutine

背景

你的目標是利用Go 中的Goroutines 並行處理項目,收集它們的結果切成片。然而,您遇到了一個令人困惑的死鎖錯誤:「all goroutine are sleep - deadlock!」

解決方案

這個錯誤源自於程式碼中的兩個問題:

  1. 延遲收集: 在收集結果之前,您正在等待所有goroutine 完成,即不正確。
  2. 通道提前關閉:結果收集循環完成後關閉通道,提前終止迭代。

修訂代碼

為了糾正這些問題,引入一個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 {
  ..
}
登入後複製

說明

  • 非同步通道關閉:匿名goroutine在所有worker完成後關閉通道,避免循環過早終止。
  • 風格推薦:考慮使用同步輔助函數(newSample) 不佔用通道和等待群組,簡化了程式碼並增強了可測試性。

重構效率

如果您需要固定數量的工作人員以獲得最佳效率,重構代碼如下:

for i, line := range contents {
  wg.Add(1)
  go func(line string) {
    defer wg.Done()
    sampleChan <- newSample(line, *replicatePtr, *timePtr)
  }(line)
}
登入後複製

這將並發原語保持在一起並簡化了各種重構並發模式。

以上是使用 Goroutines 進行平行處理和結果收集時如何避免死鎖?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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