채널의 요소 수


88

버퍼링 된 채널을 사용하여 채널에있는 요소 수를 어떻게 측정합니까? 예를 들어 다음과 같은 채널을 만들고 전송합니다.

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

send_ch 채널에 얼마나 많은 메시지 가 있는지 측정하고 싶습니다 .

동시성으로 인해 측정과 작업 사이에 선점이 발생할 수 있으므로 측정이 정확하지 않다는 것을 알고 있습니다 (예 :이 동영상 Google I / O 2012-Go Concurrency Patterns 에서 논의 됨 ). 나는 이것을 생산자와 소비자 사이의 흐름 제어를 위해 사용할 것입니다.

답변:


157

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

func len (v Type) int
len 내장 함수는 유형에 따라 v의 길이를 반환합니다.

  • 배열 : v의 요소 수.
  • 배열에 대한 포인터 : * v의 요소 수 (v가 nil 인 경우에도).
  • 슬라이스 또는 맵 : v의 요소 수; v가 nil이면 len (v)는 0입니다.
  • 문자열 : v의 바이트 수.
  • 채널 : 채널 버퍼에서 큐에 넣은 (읽지 않은) 요소의 수. v가 nil이면 len (v)는 0입니다.
package main

import "fmt"

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

다음을 출력합니다.

34

4
감사합니다 Artem. 이는 예기치 않은 len의 사용입니다. 채널의 요소 수가 아니라 채널의 용량을 반환 할 것으로 예상했을 것입니다! 다시 한 번 감사드립니다.
Sonia Hamilton

40
용량을 원했다면 내장 기능 cap이이를 수행합니다.
ANisus

6
여기서 흥미로운 점은 용량 ( c := make(chan int)) 없이 채널을 만들면 길이를 얻을 수 없다는 것입니다. 나는 이것에 대한 이유를 찾지 못했습니다. 예, 그것은뿐만 아니라 0과 같은 용량으로 돌아갑니다이다
Brettski

버퍼링되지 않으면 길이를 얻을 수 없다는 것이 이상합니다. 그리고 고 루틴을 사용하면 약간 엉망이됩니다.
Berkant Ipek

7
@Brettski 및 Berkant, 채널이 버퍼링되지 않은 경우 (capacity = 0) 길이는 항상 0입니다. 보낸 사람은받는 사람이 값을받을 때까지 차단합니다. golang.org/doc/effective_go.html#channels
Farshid T
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.