频道中的元素数目

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

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

我想测量通道send_ch中有多less个信息

我知道,由于并发性,测量将不准确,因为在测量和操作之间可能会发生抢占(例如在本video中的“ Google I / O 2012 – 并发模式”中讨论 )。 我将使用这个在生产者和消费者之间的stream量控制,即一旦我通过了一个高水印,改变了一些行为,直到我通过一个低水印回传。

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

func len(vtypes)int
len内置函数根据其types返回v的长度:

  • 数组:v中元素的数量。
  • 指向数组的指针:* v中元素的数目(即使v是零)。
  • 切片或映射:v中元素的数量; 如果v是零,len(v)是零。
  • string:v中的字节数。
  • 通道:通道缓冲区中排队(未读)元素的数量; 如果v是零,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