Número de elementos en un canal


86

Usando un canal con búfer, ¿cómo se miden cuántos elementos hay en el canal? Por ejemplo, estoy creando y enviando un canal como este:

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

Quiero medir cuántos mensajes hay en el canal send_ch .

Soy consciente de que, debido a la simultaneidad, la medición no será exacta, ya que podría producirse un adelanto entre la medición y la acción (por ejemplo, lo que se analiza en este video Google I / O 2012 - Go Concurrency Patterns ). Usaré esto para el control de flujo entre productores y consumidores, es decir, una vez que haya pasado por una marca de agua alta, cambiaré algo de comportamiento hasta que vuelva a pasar por una marca de agua baja.

Respuestas:


150

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

func len (v Type) int
La función incorporada len devuelve la longitud de v, según su tipo:

  • Array: el número de elementos en v.
  • Puntero a matriz: el número de elementos en * v (incluso si v es nulo).
  • Slice o map: el número de elementos en v; si v es nulo, len (v) es cero.
  • Cadena: el número de bytes en v.
  • Canal: el número de elementos en cola (no leídos) en el búfer del canal; si v es nulo, len (v) es cero.
package main

import "fmt"

func main() {
        c := make(chan int, 100)
        for i := 0; i < 34; i++ {
                c <- 0
        }
        fmt.Println(len(c))
}

dará salida:

34

4
Gracias Artem. Ese es un uso inesperado de len: ¡hubiera esperado que devolviera la capacidad de un canal, no la cantidad de elementos que contiene! Es bueno saberlo, gracias de nuevo.
— Sonia Hamilton

39
Si hubiera querido la capacidad, entonces la función incorporada caplo haría.
— ANisus

6
Lo que me parece interesante aquí es que si el canal se hace sin capacidad ( c := make(chan int)) no se puede obtener su longitud. No he encontrado una razón para esto. Sí, su capacidad también regresa a 0
— Brettski

Me parece extraño que cuando no está almacenado en búfer, no pueda obtener su longitud. Y cuando se usan goroutines, se estropea un poco.
— Berkant Ipek

6
@Brettski y Berkant, si el canal no tiene búfer (capacidad = 0), la longitud siempre será cero. El remitente bloquea hasta que el receptor recibe el valor. golang.org/doc/effective_go.html#channels
— Farshid T
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.