ゴルーチンの結果をスライスに収集する
ゴルーチンを使用してデータを同時に処理し、結果を収集することは、特に同時実行性とスレッドを管理する場合に困難になる場合があります。安全性。コード内で、結果を収集する前にすべての goroutine が完了するのを待機するよう waitgroup に通知されたため、デッドロック エラーが発生しました。
この問題を解決するには、すべての 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 }
この変更により、すべてのゴルーチンが終了したときに結果チャネルが確実に閉じられるようになり、結果を正しく収集できるようになります。
さらに、強化されたコードの明確さとテストのしやすさを考慮して、waitgroup とチャネルを取得するのではなく、結果を生成する同期関数になるように newSample をリファクタリングすることをお勧めします。これにより、同時実行の問題をより明確に分離し、テストを容易にすることができます。
これらの調整を実装することで、ゴルーチンから効率的に結果を収集し、デッドロック エラーを回避できます。
以上がゴルーチンからスライスに結果を収集するときにデッドロックを回避するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。