ファンイン パターンを見てみましょう。これは、まとめる必要がある複数のスレッドからの関連データがある場合に、Go で非常に役立ちます。
たとえば、異なるサービスに対して複数の API 呼び出しを行っており、その結果を結合する必要があるとします。
これは実装が非常に簡単なパターンですが、チャネルの処理方法に注意する必要があります。デッドロック状態になりやすいです。
// produce is used to simulate the different data sources func produce(id int) chan int { ch := make(chan int) go func() { for i := 0; iここでは、Produce 関数を使用してさまざまなソースをシミュレートします。これらのソース チャネルは、結合操作を実行する fanin 関数に送信されます。
fanin 関数は出力チャネルを作成し、各入力で動作する goroutine を起動します。すべての入力ソースがいつ出力チャンネルに結合されたかを示すために WaitGroup を使用します。
この単純な例では、メインスレッドは出力を反復処理するだけです。順序には保証がなく、2 つの入力の値が混在していることに注意してください。
重要なポイントは、入力の結合が完了したら出力チャンネルを閉じる必要があるということです。チャンネルが空になると、範囲オペレーターは無期限に待機します。 close(output) 行をコメントアウトすると、デッドロック状態が発生していることがわかります。
どうすればこれを改善できますか?以下にコメントを残してください。
ありがとう!
この投稿とこのシリーズのすべての投稿のコードはここにあります
免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。
Copyright© 2022 湘ICP备2022001581号-3