2012-10-22 14 views
47

Używając kanału buforowanego, jak zmierzyć ile elementów znajduje się w kanale? Na przykład, tworzę i wysyłanie na kanale tak:Liczba elementów w kanale

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

Chcę zmierzyć ile wiad są w kanale send_ch.

Jestem świadomy, że ze względu na współbieżność pomiar nie będzie dokładny, ponieważ między pomiarem a działaniem może wystąpić przeczenie (np. Omówione w tym filmie Google I/O 2012 - Go Concurrency Patterns). Użyję tego do kontroli przepływu między producentami i konsumentami, tzn. Gdy przejdę przez wysoki znak wodny, zmieniam zachowanie, aż przejdę z powrotem przez niski znak wodny.

Odpowiedz

89

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

func len (v Type) int
len wbudowana funkcja zwraca długość V, w zależności od jego typu:

  • tablicy: liczby elements in v.
  • Wskaźnik do tablicy: liczba elementów w * v (nawet jeśli v jest zerowe).
  • Kawałek lub mapa: liczba elementów w v; jeśli v jest zerowe, len (v) wynosi zero.
  • Ciąg: liczba bajtów w kodzie
  • Kanał: liczba elementów oczekujących w kolejce (nieprzeczytanych) w buforze kanału; jeśli v jest zerowe, len (v) wynosi zero.
package main 

import "fmt" 

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

wyjście wola:

34 
+2

Dzięki Artem. To nieoczekiwane użycie len - oczekiwałbym, że zwróci pojemność kanału, a nie liczbę elementów w nim! Dobrze wiedzieć, jeszcze raz dziękuję. –

+20

Jeśli chciałbyś pojemność, to wbudowana funkcja 'cap' zrobiłaby to. – ANisus

Powiązane problemy