Количество элементов в канале
используя буферизованный канал, Как измерить, сколько элементов находится в канале? Например, я создаю и отправляю на канале, Как это:
send_ch := make(chan []byte, 100)
// code
send_ch <- msg
Я хочу измерить, сколько msgs в канал send_ch.
Я знаю, что из-за параллелизма измерение не будет точным, так как упреждение может произойти между измерением и действием (например, обсуждается в этом видео Google I/O 2012 - Go Параллелизм Шаблоны). Я буду использовать это для управления потоком между производителями и потребителями, т. е. после того, как я прошел через высокий водяной знак, изменив некоторое поведение, пока я не вернусь через низкий водяной знак.
1 ответ:
http://golang.org/pkg/builtin/#len
func len (V Type) int
Встроенная функция len возвращает длину v в соответствии с ее типом:
- массив: количество элементов в v.
- указатель на массив: число элементов в *v (даже если v равно нулю).
- срез, или карта: число элементов в v; Если v равно нулю, len(v) равно нулю.
- строка: количество байтов в ст.
- канал: количество элементов в очереди(непрочитанных) в буфере канала; если v равно nil, 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