ホームページ > バックエンド開発 > Golang > Go におけるファンイン ファンアウト同時実行パターン: 包括的なガイド

Go におけるファンイン ファンアウト同時実行パターン: 包括的なガイド

Patricia Arquette
リリース: 2025-01-07 22:24:41
オリジナル
538 人が閲覧しました

⚠️ このシリーズをどのように進めていきますか?

1.すべての例を実行: コードを読むだけではありません。入力して実行し、動作を観察してください。
2.実験と破壊: スリープを削除して何が起こるか確認し、チャネル バッファー サイズを変更し、ゴルーチン数を変更します。
物を壊すことで、その仕組みがわかる
3.動作に関する理由: 変更されたコードを実行する前に、結果を予測してみてください。予期せぬ動作が見られた場合は、立ち止まってその理由を考えてください。解説に挑戦してください。
4.メンタル モデルの構築: 各ビジュアライゼーションはコンセプトを表します。変更されたコード用に独自の図を描いてみてください。

Go におけるファンイン ファンアウト同時実行パターン: 包括的なガイド

前回の投稿では、ファンインファンアウト 同時実行パターンの構成要素であるパイプライン同時実行パターンについて説明しました。ここで読んでみてください:

Go におけるファンイン ファンアウト同時実行パターン: 包括的なガイド

Go のパイプライン同時実行パターン: 包括的なビジュアル ガイド

スーヴィク・カル・マハパトラ ・ 24年12月29日

#行く #チュートリアル #プログラミング #建築

この投稿では、ファンインとファンアウトのパターンについて説明し、それらを視覚化してみます。プロセス全体を通じて実際に作業を進めていきますので、準備を整えましょう。

gear up

パイプラインパターンからの進化

ファンイン ファンアウト パターンは、パイプライン パターンの自然な進化です。パイプラインはステージを通じてデータを順次処理しますが、ファンイン ファンアウトでは並列処理機能が導入されます。この進化がどのように起こるかを視覚化してみましょう:

evolution of pipeline concurrency pattern to fan in & fan out concurrency pattern

ファンインファンアウトパターン

忙しい時間帯のレストランのキッチンを想像してみてください。注文が入ると、複数の料理人が同時に異なる料理を調理します (ファンアウト)。料理が完成すると、サービスカウンターに集まります(ファンイン)。

Fan in Fan out concurrency pattern visualized

ファンアウトについて

ファンアウトとは、複数のゴルーチンに作業を分散させてデータを並列処理することです。これは、大きなタスクを、同時に作業できる小さな部分に分割することだと考えてください。簡単な例を次に示します:

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
}
ログイン後にコピー

並列化によるパフォーマンスの向上

  • 順次アプローチでは、タスクが次々に処理され、直線的な実行時間が生じます。各タスクに 1 秒かかる場合、4 つのタスクの処理には 4 秒かかります。
  • この並列処理により、合計実行時間はおよそ (合計タスク / ワーカー数) のオーバーヘッドにまで削減されます。この例では、ワーカーが 4 人いるため、すべてのタスクが 4 秒ではなく約 1.2 秒で処理されます。
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>

ログイン後にコピー
  • Go のチャネル機構を通じて同時実行性を自動的に管理します
  • 処理が取り込みよりも遅い場合に、自然なバックプレッシャーを提供します
  • ワーカーの数を調整することで簡単にスケーリングできます
  • 分離されたエラー処理によりシステムの回復力を維持します

エラー処理の原則

フェイルファスト: パイプラインの早い段階でエラーを検出して処理します。

パイプラインの開始前または開始時にあらゆる種類の検証を実行して、後で失敗する可能性のある無効な作業でリソースを無駄にしないように、パイプラインが失敗しないことを確認してください。無効なデータによりワーカーがブロックされたり、並列処理能力が無駄になる可能性があるため、ファンイン ファンアウト パターンでは特に重要です。

ただし、これは厳密なルールではなく、ビジネス ロジックに大きく依存します。実際の例でそれを実装する方法は次のとおりです:

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 サイトの他の関連記事を参照してください。

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