チャネル マルチプレクサ: パフォーマンスと機能の強化
チャネル マルチプレクサ関数 Mux の機能と出力について懸念を表明しました。それぞれの質問に答えてみましょう:
1. Mux のエラー?
Mux の元の実装には小さな問題があります。 Mux から生成された各ゴルーチンは、同じチャネル (c) からプルしようとします。これは、c がループの反復ごとに更新されるためです。これを解決するには、以下に示すように、チャネルを値で goroutine に渡します。
for _, c := range channels { go func(c <-chan big.Int) { ... }(c) }
2.制限された出力
Mux は、複数のチャンネルの出力を 1 つにマージするように設計されています。ただし、テスト ケースでは、出力チャネルから最後の 10 個の値のみを受信します。これは、入力チャンネルを閉じると Mux でカウントダウンがトリガーされるためです。各入力チャンネルが閉じるとカウントダウンが減少し、最終的にゼロに達し、出力チャンネルが閉じます。これは、出力チャネルが、閉じられた最後の数個の入力チャネルからの値のみを受信することを意味します。
3.異常なフィード パターン
ゴルーチンの使用方法が原因で、フィード パターンは予期せぬものになります。各ゴルーチンは、特定の入力チャネルから値を取得し、出力チャネルに送信します。ただし、ゴルーチンは独立しているため、同時に実行し、非決定的な順序で出力チャネルに値を送信できます。その結果、摂食に明らかな不規則性が生じます。
4.より良いアプローチ
Mux のパフォーマンスと機能を向上させるために、sync.WaitGroup と呼ばれる同期プリミティブを使用できます。 WaitGroup を使用すると、特定の数のゴルーチンが完了するまで待機できます。この場合、WaitGroup を使用して、出力チャネルに値を送信するすべてのゴルーチンが終了するのを待つことができます。すべてのゴルーチンが完了した後でのみ、出力チャネルを閉じてください。
次のコードは、WaitGroup を使用して変更された Mux 関数を示しています。
import ( "math/big" "sync" ) func Mux(channels []chan big.Int) chan big.Int { var wg sync.WaitGroup wg.Add(len(channels)) ch := make(chan big.Int, len(channels)) for _, c := range channels { go func(c <-chan big.Int) { for x := range c { ch <- x } wg.Done() }(c) } go func() { wg.Wait() close(ch) }() return ch }
WaitGroup を使用すると、出力チャネルが確実に閉じられます。すべての入力チャンネルが処理された場合にのみ閉じられるため、すべての入力チャンネルからすべての値を確定的な順序で受信できます。
以上がチャネル マルチプレクサ機能のパフォーマンスを向上させ、すべての出力値が確実に受信されるようにするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。