Количество элементов в канале


используя буферизованный канал, Как измерить, сколько элементов находится в канале? Например, я создаю и отправляю на канале, Как это:

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

Я хочу измерить, сколько msgs в канал send_ch.

Я знаю, что из-за параллелизма измерение не будет точным, так как упреждение может произойти между измерением и действием (например, обсуждается в этом видео Google I/O 2012 - Go Параллелизм Шаблоны). Я буду использовать это для управления потоком между производителями и потребителями, т. е. после того, как я прошел через высокий водяной знак, изменив некоторое поведение, пока я не вернусь через низкий водяной знак.

1 52

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