Number of elements in a channel

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

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

我想测量通道 发送中有多少个 味精

我知道,由于并发性,测量将不是精确的,因为抢占可能发生在测量和行动之间(例如在这个视频 Google I/O 2012-Go 并发模式讨论)。我将使用这个来控制生产者和消费者之间的流量,即一旦我通过了一个高水印,改变一些行为,直到我通过一个低水印。

79349 次浏览

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

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

  • 数组: v 中的元素数。
  • 指向数组的指针: * v 中的元素数(即使 v 为零)。
  • Slice 或 map: v 中的元素数; 如果 v 为零,len (v)为零。
  • String: the number of bytes in v.
  • Channel: 通道缓冲区中排队(未读)的元素数; 如果 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

要获取发送 go 例程的缓冲通道的长度:

    done := make(chan bool)
ch1 := make(chan string, 3)


go func() {
for i := 0; i < 3; i++ {
ch1 <- "hello"
}
done <- true
}()


<-done
fmt.Println(len(ch1))