チャネル内の要素の数


88

バッファリングされたチャネルを使用して、チャネル内の要素の数をどのように測定しますか?たとえば、次のようなチャネルを作成して送信しています。

send_ch := make(chan []byte, 100)
// code
send_ch <- msg

チャネルsend_chにあるメッセージの数を測定したいと思います。

測定とアクションの間にプリエンプションが発生する可能性があるため、同時実行性のために測定値が正確ではないことを認識しています(たとえば、このビデオGoogle I / O 2012-Go Concurrency Patternsで説明されています)。これをプロデューサーとコンシューマー間のフロー制御に使用します。つまり、高水準点を通過したら、低水準点を通過するまで動作を変更します。

回答:


155

http://golang.org/pkg/builtin/#len

func len(v Type)int
len組み込み関数は、そのタイプに応じてvの長さを返します。

  • 配列:vの要素の数。
  • 配列へのポインター:* v内の要素の数(vがnilの場合でも)。
  • スライスまたはマップ:vの要素の数。vがnilの場合、len(v)はゼロです。
  • 文字列:vのバイト数。
  • チャネル:チャネルバッファでキューに入れられた(未読の)要素の数。vがnilの場合、len(v)はゼロです。
package main

import "fmt"

func main() {
        c := make(chan int, 100)
        for i := 0; i < 34; i++ {
                c <- 0
        }
        fmt.Println(len(c))
}

出力します:

34

4
Artemに感謝します。これは、lenの予期しない使用法です。チャネル内の要素の数ではなく、チャネルの容量を返すことを期待していました。知っておくと、ありがとう。
ソニアハミルトン

40
容量が必要な場合は、組み込み関数capがそれを行います。
anisus 2012年

6
ここで興味深いのは、容量(c := make(chan int))なしでチャネルを作成すると、その長さを取得できないことです。私はこれの理由を見つけていません。はい、それは同様に0として容量のリターンをだ
Brettski

バッファリングされていないときは、その長さがわからないのが不思議です。そして、ゴルーチンを使用するとき、それはちょっと混乱します。
BerkantIpek19年

7
@BrettskiとBerkant、チャネルがバッファリングされていない場合(容量= 0)、長さは常にゼロになります。送信者は、受信者が値を受信するまでブロックします。golang.org/doc/effective_go.html#channels
Farshid T
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.