一尘不染

通道中的元素数

go

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

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

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

我知道由于并发性,测量不会准确,因为在测量和操作之间可能会发生抢占。我将使用它来控制生产者和消费者之间的流量,即一旦我通过了高水印,就会改变一些行为,直到我通过低水印。


阅读 181

收藏
2021-12-01

共1个答案

一尘不染

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

  • 数组:v 中元素的数量。
  • 指向数组的指针:*v 中的元素数(即使 v 为零)。
  • 切片或映射: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))
}

将输出:

34
2021-12-01