使用缓冲通道,如何测量通道中有多少元素?例如,我正在创建和发送这样的频道:
send_ch := make(chan []byte, 100)
// code
send_ch <- msg
我想衡量 send_ch 频道中 msgs 的数量。
我知道由于并发性,测量结果不准确,因为在测量和行动之间可能会发生先发制人(例如在本视频中讨论Google I/O 2012 - Go Concurrency Patterns)。我将把它用于生产者和消费者之间的流量控制,即一旦我通过高水印,改变一些行为,直到我通过低水印回传。
答案 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