2012-10-22 20 views
47

Wie können Sie mit einem gepufferten Kanal messen, wie viele Elemente sich im Kanal befinden? Zum Beispiel, ich bin zu schaffen und auf einem Kanal wie folgt gesendet:Anzahl der Elemente in einem Kanal

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

ich messen will, wie viele msgs im Kanal send_ch sind.

Ich bin mir bewusst, dass die Messung aufgrund der Parallelität nicht genau sein wird, da eine Vorbelegung zwischen Messung und Aktion auftreten könnte (zB in diesem Video beschrieben Google I/O 2012 - Go Concurrency Patterns). Ich werde das für die Flusskontrolle zwischen Produzenten und Konsumenten verwenden, dh sobald ich ein High Watermark passiert habe, etwas Verhalten ändern, bis ich durch ein niedriges Wasserzeichen zurückgehe.

Antwort

89

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

func len (v Type) int
LEN eingebaute Funktion, die Länge von v liefert, je nach Typ:

  • Array: die Anzahl der Elemente in v.
  • Zeiger auf Array: die Anzahl der Elemente in * v (auch wenn v ist Null).
  • Slice oder Map: die Anzahl der Elemente in v; Wenn v Null ist, ist len ​​(v) Null.
  • Zeichenfolge: die Anzahl der Bytes in v.
  • Kanal: Die Anzahl der Elemente in der Warteschlange (ungelesen) im Kanalpuffer; Wenn v Null ist, ist len ​​(v) Null.
package main 

import "fmt" 

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

AUSGABE:

34 
+2

Dank Artem. Das ist ein unerwarteter Einsatz von len - ich hätte erwartet, dass es die Kapazität eines Kanals zurückgibt, nicht die Anzahl der Elemente darin! Gut zu wissen, nochmals vielen Dank. –

+20

Wenn Sie die Kapazität haben wollten, dann würde die eingebaute Funktion 'cap' es tun. – ANisus

Verwandte Themen