ゴルーチンからスライスに結果を収集するときにデッドロックを回避するにはどうすればよいですか?

Patricia Arquette
リリース: 2024-11-12 05:59:01
オリジナル
501 人が閲覧しました

How to Avoid Deadlock When Gathering Results from Goroutines into a Slice?

ゴルーチンの結果をスライスに収集する

ゴルーチンを使用してデータを同時に処理し、結果を収集することは、特に同時実行性とスレッドを管理する場合に困難になる場合があります。安全性。コード内で、結果を収集する前にすべての 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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート