通道中的元素数


86

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

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

我想衡量有多少封邮件都在通道send_ch

我知道由于并发,该度量将不准确,因为在度量和操作之间可能会发生先发制人(例如,在此视频中讨论的Google I / O 2012-Go并发模式)。我将使用它在生产者和消费者之间进行流控制,即,一旦我通过了较高的水印,就更改了某些行为,直到我通过了较低的水印。

Answers:


150

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

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

  • 数组:v中的元素数。
  • 指向数组的指针:* v中的元素数(即使v为零)。
  • 切片或贴图:v中的元素数量;如果v为零,则len(v)为零。
  • 字符串: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

4
感谢Artem。这是len的意外使用-我希望它会返回通道的容量,而不是其中的元素数量!很高兴知道,再次感谢。
索尼娅·汉密尔顿

39
如果您需要容量,则内置函数cap可以完成。
2012年

6
我在这里发现有趣的是,如果通道是在没有Capacity(c := make(chan int))的情况下创建的,则无法获得其长度。我还没有找到原因。是的,它的容量返回也为0
Brettski '19

我感到奇怪的是,当它没有缓冲时,我无法得到它的长度。当使用goroutines时,有点混乱。
Berkant Ipek,

6
@Brettski和Berkant,如果通道未缓冲(容量= 0),则长度将始终为零。发送方阻塞,直到接收方收到该值为止。golang.org/doc/effective_go.html#channels
费•牛逼
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.