버퍼링 된 채널을 사용하여 채널에있는 요소 수를 어떻게 측정합니까? 예를 들어 다음과 같은 채널을 만들고 전송합니다.
send_ch := make(chan []byte, 100)
// code
send_ch <- msg
send_ch 채널에 얼마나 많은 메시지 가 있는지 측정하고 싶습니다 .
동시성으로 인해 측정과 작업 사이에 선점이 발생할 수 있으므로 측정이 정확하지 않다는 것을 알고 있습니다 (예 :이 동영상 Google I / O 2012-Go Concurrency Patterns 에서 논의 됨 ). 나는 이것을 생산자와 소비자 사이의 흐름 제어를 위해 사용할 것입니다.
답변
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