通道中的元素数量

时间:2012-10-22 00:56:06

标签: go

使用缓冲通道,如何测量通道中有多少元素?例如,我正在创建和发送这样的频道:

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

我想衡量 send_ch 频道中 msgs 的数量。

我知道由于并发性,测量结果不准确,因为在测量和行动之间可能会发生先发制人(例如在本视频中讨论Google I/O 2012 - Go Concurrency Patterns)。我将把它用于生产者和消费者之间的流量控制,即一旦我通过高水印,改变一些行为,直到我通过低水印回传。

1 个答案:

答案 0 :(得分:119)

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

  

func len(v Type)int
  len内置函数根据其类型返回v的长度:

     
      
  • 数组:v。
  • 中的元素数量   
  • 指向数组的指针:* v中的元素数(即使v为nil)。
  •   
  • 切片或贴图:v中元素的数量;如果v为零,则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