チャネル マルチプレクサ
質問:
チャネル マルチプレクサを作成しようとしましたが、複数のチャネルの出力を 1 つに結合すると、プログラマは予期しない動作に遭遇し、次のようなガイダンスを求めます。質問:
答え:
コードfor ループを使用して各チャネルのゴルーチンを作成します。ただし、変数 c はループの反復ごとに更新されるため、ゴルーチンはすべて同じチャネルから読み取られます。これを解決するには、チャネルを goroutine に直接渡す必要があります:
for _, c := range channels { go func(c <-chan big.Int) { // ... }(c) }
コードはすべてを初期化します。出力値を「false」にすると、false 値のみが出力されます。これは、行 fmt.Println(l) を fmt.Println(l.String()) に置き換えることで解決できます。
フィード パターンは、ゴルーチンが同じコードから読み取ろうとしている前述のコード エラーによって発生します。チャンネル。上記の修正によりこの問題が解決され、すべての入力チャンネルからのバランス出力が可能になります。
提供されているマルチプレクサーの実装は基本的なものです。アプローチ。より高いパフォーマンスや同時実行性が必要なシナリオの場合、代替オプションとして、チャネルまたはミューテックスなどの同期プリミティブを介したメッセージ受け渡しが考慮される場合があります。
以上が複数のチャネルを効率的に多重化し、予期しない動作を回避するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。