Go では、select ステートメントを使用して複数のチャネルを同時に監視できます。ただし、両方のチャネルがデータを受信している場合、本質的に一方のチャネルが別のチャネルよりも優先されるわけではありません。特定のメッセージが特定の順序で処理されるようにしたい場合、これは問題となる可能性があります。
この問題を解決するには、Go の組み込みチャネル クローズ メカニズムを活用し、チャネル上の範囲の反復。チャネルが閉じられると、それ以上データが送信されないことが通知されます。必要なメッセージがすべて処理された場合にのみ終了することを目的としたチャネルを閉じることで、優先システムを効果的に作成できます。
次の例を考えてみましょう:
package main import ( "fmt" "math/rand" "sync" "time" ) var ( produced = 0 processed = 0 m sync.Mutex ) func produceEndlessly(out chan int, quit chan bool) { defer close(out) for { out <- rand.Int() time.Sleep(time.Duration(rand.Int63n(5e6))) m.Lock() produced++ m.Unlock() } } func quitRandomly(quit chan bool) { d := time.Duration(rand.Int63n(5e9)) time.Sleep(d) m.Lock() if produced > 10 { close(quit) } m.Unlock() } func main() { vals, quit := make(chan int, 10), make(chan bool) go produceEndlessly(vals, quit) go quitRandomly(quit) for x := range vals { fmt.Println(x) m.Lock() processed++ m.Unlock() } fmt.Println("Produced:", produced) fmt.Println("Processed:", processed) }
この例では:
生成されたメッセージが 10 を超えたときに Quit を閉じることで、プログラムが終了する前に 10 個のメッセージすべてが処理されることが保証されます。チャネルが閉じられるまで vals ブロックの範囲反復を行い、ループを終了する前にすべてのメッセージが処理されることを保証します。
このアプローチは、Go の select ステートメントでメッセージ処理に優先順位を付ける簡単で効果的な方法を提供します。
以上がGo の「select」ステートメントでチャネル処理に優先順位を付けるにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。