patterngoCritical
Number of elements in a channel
Viewed 0 times
channelelementsnumber
Problem
Using a buffered channel, how do measure how many elements are in the channel? For example, I'm creating and sending on a channel like this:
I want to measure how many msgs are in the channel send_ch.
I'm aware that due to concurrency the measurement won't be exact, as pre-emption could occur between measurement and action (eg discussed in this video Google I/O 2012 - Go Concurrency Patterns). I'll be using this for flow control between producers and consumers ie once I've passed through a high watermark, changing some behaviour until I pass back through a low watermark.
send_ch := make(chan []byte, 100)
// code
send_ch <- msgI want to measure how many msgs are in the channel send_ch.
I'm aware that due to concurrency the measurement won't be exact, as pre-emption could occur between measurement and action (eg discussed in this video Google I/O 2012 - Go Concurrency Patterns). I'll be using this for flow control between producers and consumers ie once I've passed through a high watermark, changing some behaviour until I pass back through a low watermark.
Solution
http://golang.org/pkg/builtin/#len
func len(v Type) int
The len built-in function returns the length of v, according to its type:
will output:
func len(v Type) int
The len built-in function returns the length of v, according to its type:
- Array: the number of elements in v.
- Pointer to array: the number of elements in *v (even if v is nil).
- Slice, or map: the number of elements in v; if v is nil, len(v) is zero.
- String: the number of bytes in v.
- Channel: the number of elements queued (unread) in the channel buffer; if v is nil, len(v) is zero.
package main
import "fmt"
func main() {
c := make(chan int, 100)
for i := 0; i < 34; i++ {
c <- 0
}
fmt.Println(len(c))
}will output:
34Code Snippets
package main
import "fmt"
func main() {
c := make(chan int, 100)
for i := 0; i < 34; i++ {
c <- 0
}
fmt.Println(len(c))
}Context
Stack Overflow Q#13003749, score: 217
Revisions (0)
No revisions yet.