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:
send_ch := make(chan []byte, 100)
// code
send_ch <- msg
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.
In Golang, len function is used to find the length of a channel, pointer, slice, string, and map.
First off, the maximum message size (or channel type) is 2^16 bytes, or 64 kilobytes.
When a channel is created with no capacity, it is called an unbuffered channel. In turn, a channel created with capacity is called a buffered channel.
The range keyword can also be used on a channel. By doing so, it will iterate over every item thats send on the channel. You can iterate on both buffered and unbuffered channels, but buffered channels need to be closed before iterating over them.
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:
- 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:
34
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With