使用缓冲通道,如何测量通道中有多少元素?例如,我正在创建和发送这样的频道:
send_ch := make(chan []byte, 100)
// code
send_ch <- msg
Run Code Online (Sandbox Code Playgroud)
我想衡量有多少封邮件都在通道send_ch.
我知道由于并发性,测量结果不准确,因为测量和行动之间可能会发生先发制人(例如在本视频中讨论的Google I/O 2012 - Go Concurrency Patterns).我将把它用于生产者和消费者之间的流量控制,即一旦我通过高水印,改变一些行为,直到我通过低水印回传.
Art*_*tov 124
http://golang.org/pkg/builtin/#len
func len(v Type)int
len内置函数根据其类型返回v的长度:
- 数组:v中元素的数量.
- 指向数组的指针:*v中的元素数(即使v为nil).
- 切片或贴图:v中元素的数量; 如果v为零,则len(v)为零.
- 字符串: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))
}
Run Code Online (Sandbox Code Playgroud)
将输出:
34
Run Code Online (Sandbox Code Playgroud)