Подтвердить что ты не робот

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

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

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

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

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

4b9b3361

Ответ 1

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

func len (v Тип) int
Функция len built-in возвращает длину v в соответствии с ее типом:

  • Массив: количество элементов в v.
  • Указатель на массив: количество элементов в * v (даже если v равно nil).
  • Slice, или map: количество элементов в v; если v равно нулю, len (v) равно нулю.
  • String: количество байтов в v.
  • Канал: количество элементов, находящихся в очереди (непрочитанных) в буфере канала; если v равно нулю, 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