目次
Go のパイプライン同時実行パターン: 包括的なビジュアル ガイド
スーヴィク・カル・マハパトラ ・ 24年12月29日
Golang でのゴルーチンとチャネルの理解と視覚化
Souvik Kar Mahapatra ・ 2024 年 12 月 20 日
ホームページ バックエンド開発 Golang Go におけるファンイン ファンアウト同時実行パターン: 包括的なガイド

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

Jan 07, 2025 pm 10:24 PM

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

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="/static/imghw/default1.png" data-src="https://img.php.cn/upload/article/000/000/000/173625991579012.png" class="lazy" 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="/static/imghw/default1.png" data-src="https://img.php.cn/upload/article/000/000/000/173625991836275.png" class="lazy" 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="/static/imghw/default1.png" data-src="https://img.php.cn/upload/article/000/000/000/173625990185651.png" class="lazy" alt="Go におけるファンイン ファンアウト同時実行パターン: 包括的なガイド" loading="lazy">
    </div>
<div>
      <h2 id="Golang-でのゴルーチンとチャネルの理解と視覚化">Golang でのゴルーチンとチャネルの理解と視覚化</h2>
      <h3 id="Souvik-Kar-Mahapatra-年-月-日">Souvik Kar Mahapatra ・ 2024 年 12 月 20 日</h3>
      <div>
        #行く
        #プログラミング
        #学ぶ
        #チュートリアル
      </div>
    </div>
  
</div>



<p>Go の同時実行パターンについては今後も続報をお待ちください! ?</p>

<p><img src="/static/imghw/default1.png" data-src="https://img.php.cn/upload/article/000/000/000/173625992371812.gif" class="lazy" alt="Go におけるファンイン ファンアウト同時実行パターン: 包括的なガイド" loading="lazy"    style="max-width:90%"  style="max-width:90%"></p>


          

            
  

            
        
ログイン後にコピー

以上がGo におけるファンイン ファンアウト同時実行パターン: 包括的なガイドの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Golangの目的:効率的でスケーラブルなシステムの構築 Golangの目的:効率的でスケーラブルなシステムの構築 Apr 09, 2025 pm 05:17 PM

GO言語は、効率的でスケーラブルなシステムの構築においてうまく機能します。その利点には次のものがあります。1。高性能:マシンコードにコンパイルされ、速度速度が速い。 2。同時プログラミング:ゴルチンとチャネルを介してマルチタスクを簡素化します。 3。シンプルさ:簡潔な構文、学習コストとメンテナンスコストの削減。 4。クロスプラットフォーム:クロスプラットフォームのコンパイル、簡単な展開をサポートします。

Golang and C:Concurrency vs. Raw Speed Golang and C:Concurrency vs. Raw Speed Apr 21, 2025 am 12:16 AM

Golangは並行性がCよりも優れていますが、Cは生の速度ではGolangよりも優れています。 1)Golangは、GoroutineとChannelを通じて効率的な並行性を達成します。これは、多数の同時タスクの処理に適しています。 2)Cコンパイラの最適化と標準ライブラリを介して、極端な最適化を必要とするアプリケーションに適したハードウェアに近い高性能を提供します。

Golang vs. Python:重要な違​​いと類似点 Golang vs. Python:重要な違​​いと類似点 Apr 17, 2025 am 12:15 AM

GolangとPythonにはそれぞれ独自の利点があります。Golangは高性能と同時プログラミングに適していますが、PythonはデータサイエンスとWeb開発に適しています。 Golangは同時性モデルと効率的なパフォーマンスで知られていますが、Pythonは簡潔な構文とリッチライブラリエコシステムで知られています。

Golang vs. Python:パフォーマンスとスケーラビリティ Golang vs. Python:パフォーマンスとスケーラビリティ Apr 19, 2025 am 12:18 AM

Golangは、パフォーマンスとスケーラビリティの点でPythonよりも優れています。 1)Golangのコンピレーションタイプの特性と効率的な並行性モデルにより、高い並行性シナリオでうまく機能します。 2)Pythonは解釈された言語として、ゆっくりと実行されますが、Cythonなどのツールを介してパフォーマンスを最適化できます。

パフォーマンスレース:ゴラン対c パフォーマンスレース:ゴラン対c Apr 16, 2025 am 12:07 AM

GolangとCにはそれぞれパフォーマンス競争において独自の利点があります。1)Golangは、高い並行性と迅速な発展に適しており、2)Cはより高いパフォーマンスと微細な制御を提供します。選択は、プロジェクトの要件とチームテクノロジースタックに基づいている必要があります。

Golangの影響:速度、効率、シンプルさ Golangの影響:速度、効率、シンプルさ Apr 14, 2025 am 12:11 AM

speed、効率、およびシンプル性をspeedsped.1)speed:gocompilesquilesquicklyandrunseffictient、理想的なlargeprojects.2)効率:等系dribribraryreducesexexternaldedenciess、開発効果を高める3)シンプルさ:

CとGolang:パフォーマンスが重要な場合 CとGolang:パフォーマンスが重要な場合 Apr 13, 2025 am 12:11 AM

Cは、ハードウェアリソースと高性能の最適化が必要なシナリオにより適していますが、Golangは迅速な開発と高い並行性処理が必要なシナリオにより適しています。 1.Cの利点は、ハードウェア特性と高い最適化機能に近いものにあります。これは、ゲーム開発などの高性能ニーズに適しています。 2.Golangの利点は、その簡潔な構文と自然な並行性サポートにあり、これは高い並行性サービス開発に適しています。

GolangとC:パフォーマンスのトレードオフ GolangとC:パフォーマンスのトレードオフ Apr 17, 2025 am 12:18 AM

GolangとCのパフォーマンスの違いは、主にメモリ管理、コンピレーションの最適化、ランタイム効率に反映されています。 1)Golangのゴミ収集メカニズムは便利ですが、パフォーマンスに影響を与える可能性があります。

See all articles