6

プログラムのボトルネックを特定しました。それはバッファリングされたチャネルです。チャネルにバッファリングされたメッセージの数によって示されるシステム負荷の指標をクライアントに提供したいと思います。

チャネルにバッファリングされたメッセージの数を Go で確認する方法はありますか?

Java のバックグラウンドもある場合は、これと同等のものを探しています: http://docs.oracle.com/javase/6/docs/api/java/util/concurrent/LinkedBlockingQueue.html#size()

4

2 に答える 2

-1

メッセージのキューイングを処理し、そのサイズを報告できる「キュー」プロセスを使用する、これに対する代替ソリューションがあります。このためには、入力チャネルと出力チャネルに加えて、サイズを取得するためのクエリ チャネルが必要です。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)
            }
        }
    }
}
于 2013-06-11T09:15:05.167 に答える