メッセージのキューイングを処理し、そのサイズを報告できる「キュー」プロセスを使用する、これに対する代替ソリューションがあります。このためには、入力チャネルと出力チャネルに加えて、サイズを取得するためのクエリ チャネルが必要です。2 つの入力チャネルがあるため、それらの間に選択 (CSP の「選択」) が必要になります。
これが動作中の小さなデモです。キューは、バッファとしてのスライスと入力チャネルで構成されます。
func queue(in <-chan string, out chan<- string, query <-chan chan int) {
buffer := []string{}
var s string
var reply chan int
for {
// Go select doesn't support boolean guards so we need the 'if' outside the select instead
if len(buffer) > 0 {
select {
case reply = <-query:
reply <- len(buffer)
case s = <-in:
buffer = append(buffer, s)
case out <- buffer[0]:
buffer = buffer[1:]
}
} else {
select {
case reply = <-query:
reply <- len(buffer)
case s = <-in:
buffer = append(buffer, s)
}
}
}
}