通道中的元素数量

Son*_*ton 69 go

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

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)

  • 如果你想要容量,那么内置函数`cap`就可以了. (30认同)
  • 谢谢阿尔乔姆.这是对len的一种不期望的使用 - 我原以为它会返回一个通道的容量,而不是它中的元素数量!很高兴知道,再次感谢. (4认同)
  • 我在这里发现有趣的是,如果通道没有容量(`c:= make(chan int)`),则无法获得其长度。我还没有找到原因。是的,它的容量也返回0 (3认同)
  • 我觉得很奇怪,当它没有缓冲时,我无法得到它的长度。当使用 goroutine 时,它​​有点混乱。 (2认同)
  • @Brettski和Berkant,如果通道未缓冲(容量= 0),则长度将始终为零。发送方阻塞,直到接收方收到该值为止。https://golang.org/doc/effective_go.html#channels (2认同)
  • 它总是返回零(我试图找到一个例子,但我已经有近 4 个月没有使用 go 了) (2认同)