109 votes

Nombre d'éléments dans un canal

En utilisant un canal tamponné, comment mesurer le nombre d'éléments présents dans le canal ? Par exemple, je crée et envoie sur un canal comme ceci :

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

Je veux mesurer combien msgs sont dans le canal envoyer_ch .

Je suis conscient qu'en raison de la concurrence, la mesure ne sera pas exacte, car la préemption peut se produire entre la mesure et l'action (voir par exemple cette vidéo). Google I/O 2012 - Les modèles de concordance de Go ). Je l'utiliserai pour contrôler le flux entre les producteurs et les consommateurs, c'est-à-dire qu'une fois que j'ai franchi un filigrane élevé, je changerai de comportement jusqu'à ce que je repasse par un filigrane bas.

191voto

Artem Shitov Points 520

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

func len(v Type) int
La fonction intégrée len renvoie la longueur de v, en fonction de son type :

  • Tableau : le nombre d'éléments dans v.
  • Pointeur vers le tableau : le nombre d'éléments dans *v (même si v est nil).
  • Slice, ou map : le nombre d'éléments dans v ; si v est nil, len(v) est zéro.
  • String : le nombre d'octets dans v.
  • Canal : le nombre d'éléments en attente (non lus) dans le tampon du canal ; si v est nil, len(v) est zéro.
package main

import "fmt"

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

produira un résultat :

34

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X