1.すべての例を実行: コードを読むだけではありません。入力して実行し、動作を観察してください。⚠️ このシリーズをどのように進めていきますか?
2.実験と破壊: スリープを削除して何が起こるか確認し、チャネル バッファー サイズを変更し、ゴルーチン数を変更します。
物を壊すことで、その仕組みがわかる
3.動作に関する理由: 変更されたコードを実行する前に、結果を予測してみてください。予期せぬ動作が見られた場合は、立ち止まってその理由を考えてください。解説に挑戦してください。
4.メンタル モデルの構築: 各ビジュアライゼーションはコンセプトを表します。変更されたコード用に独自の図を描いてみてください。
前回の投稿では、ファンイン と ファンアウト 同時実行パターンの構成要素であるパイプライン同時実行パターンについて説明しました。ここで読んでみてください:
この投稿では、ファンインとファンアウトのパターンについて説明し、それらを視覚化してみます。プロセス全体を通じて実際に作業を進めていきますので、準備を整えましょう。
ファンイン ファンアウト パターンは、パイプライン パターンの自然な進化です。パイプラインはステージを通じてデータを順次処理しますが、ファンイン ファンアウトでは並列処理機能が導入されます。この進化がどのように起こるかを視覚化してみましょう:
忙しい時間帯のレストランのキッチンを想像してみてください。注文が入ると、複数の料理人が同時に異なる料理を調理します (ファンアウト)。料理が完成すると、サービスカウンターに集まります(ファンイン)。
ファンアウトとは、複数のゴルーチンに作業を分散させてデータを並列処理することです。これは、大きなタスクを、同時に作業できる小さな部分に分割することだと考えてください。簡単な例を次に示します:
func fanOut(input <h3> ファンインを理解する </h3> <p>ファンインはファンアウトの逆で、複数の入力チャンネルを 1 つのチャンネルに結合します。これは、すべてのワーカーからの結果を 1 つのストリームに収集するファネルのようなものです。実装方法は次のとおりです:<br> </p> <pre class="brush:php;toolbar:false">func fanIn(inputs ... <p>数値を並列処理する完全な例を使ってすべてをまとめてみましょう:<br> </p> <pre class="brush:php;toolbar:false">func main() { // Create our input channel input := make(chan int) // Start sending numbers go func() { defer close(input) for i := 1; i <h2> ファンインファンアウトパターンを使用する理由 </h2> <p><strong>リソースの最適利用</strong></p> <p>このパターンは、使用可能なリソース全体に作業を自然に分散するため、リソースのアイドル状態が防止され、スループットが最大化されます。<br> </p> <pre class="brush:php;toolbar:false">// Worker pool size adapts to system resources numWorkers := runtime.NumCPU() if numWorkers > maxWorkers { numWorkers = maxWorkers // Prevent over-allocation }
並列化によるパフォーマンスの向上
func fanOut(tasks []Task) { numWorkers := runtime.NumCPU() // Utilize all available CPU cores workers := make([] <h2> 実際の使用例 </h2> <p><strong>画像処理パイプライン</strong></p> <p>これはパイプライン パターンの投稿からのアップグレードのようなもので、処理を高速化し、各プロセスから専用の go ルーチンを用意する必要があります。</p><p><img src="https://img.php.cn/upload/article/000/000/000/173625991579012.png" alt="Go におけるファンイン ファンアウト同時実行パターン: 包括的なガイド processing pipeline with fan in and fan out pattern" loading="lazy" style="max-width:90%" style="max-width:90%"></p> <p><strong>Web スクレイパー パイプライン</strong><br> Web スクレイピングは、ファンイン ファンアウトのもう 1 つの完璧な使用例です。</p> <p><img src="https://img.php.cn/upload/article/000/000/000/173625991836275.png" alt="Web scraping is another perfect use case for fan-in fan-out" loading="lazy" style="max-width:90%" style="max-width:90%"></p> <p>ファンイン ファンアウト パターンは、次の理由からこれらのシナリオで非常に効果的です。</p>
パイプラインの開始前または開始時にあらゆる種類の検証を実行して、後で失敗する可能性のある無効な作業でリソースを無駄にしないように、パイプラインが失敗しないことを確認してください。無効なデータによりワーカーがブロックされたり、並列処理能力が無駄になる可能性があるため、ファンイン ファンアウト パターンでは特に重要です。
ただし、これは厳密なルールではなく、ビジネス ロジックに大きく依存します。実際の例でそれを実装する方法は次のとおりです:
func fanOut(input <p>と<br> </p> <pre class="brush:php;toolbar:false">func fanIn(inputs ... <p>注意!一方のワーカーでエラーが発生しても、もう一方のワーカーは停止せずに処理を続けるため、第 2 の原則に戻ります</p> <h3> 障害の分離: 1 人の作業者のエラーが他の作業者に影響を与えてはなりません </h3> <p>並列処理システムでは、1 つの悪いタスクがシステム全体をダウンさせることはありません。各労働者は独立している必要があります。<br> </p> <pre class="brush:php;toolbar:false">func main() { // Create our input channel input := make(chan int) // Start sending numbers go func() { defer close(input) for i := 1; i <h4> リソースのクリーンアップ: エラー時の適切なクリーンアップ </h4> <p>並列処理におけるリソース リークは、すぐにシステム全体の問題に発展する可能性があります。適切な清掃が不可欠です。</p> <hr> <p>これで、ファンインとファンアウトのパターンについて詳しく説明しました。次に、この投稿で垣間見た <strong>ワーカー プールの同時実行パターン</strong> について見ていきます。先ほども言いましたが、次の依存関係に移る前に、依存関係を徐々に解消していきます。</p> <p>この投稿が役に立ったと思われた場合、ご質問がある場合、またはこのパターンに関するご自身の経験を共有したい場合は、以下のコメント欄からご意見をお待ちしております。皆様の洞察や質問は、これらの説明を誰にとってもさらにわかりやすくするのに役立ちます。</p> <p>Golang のゴルーチンとチャネルのビジュアルガイドを見逃した場合は、ここで確認してください:</p> <div> <div> <img src="https://img.php.cn/upload/article/000/000/000/173625990185651.png" alt="Go におけるファンイン ファンアウト同時実行パターン: 包括的なガイド" loading="lazy"> </div> <div> <h2>Golang でのゴルーチンとチャネルの理解と視覚化</h2> <h3>Souvik Kar Mahapatra ・ 2024 年 12 月 20 日</h3> <div> #行く #プログラミング #学ぶ #チュートリアル </div> </div> </div> <p>Go の同時実行パターンについては今後も続報をお待ちください! ?</p> <p><img src="https://img.php.cn/upload/article/000/000/000/173625992371812.gif" alt="Go におけるファンイン ファンアウト同時実行パターン: 包括的なガイド" loading="lazy" style="max-width:90%" style="max-width:90%"></p>
以上がGo におけるファンイン ファンアウト同時実行パターン: 包括的なガイドの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。