Unbuffered channels block receivers until data is available on the channel. It\'s not clear to me how this blocking behaves with multiple receivers on the same channel (say
By default the goroutine communication is synchronous
and unbuffered
: sends do not complete until there is a receiver to accept the value. There must be a receiver ready to receive data from the channel and then the sender can hand it over directly to the receiver.
So channel send/receive operations block until the other side is ready:
1. A send operation on a channel blocks until a receiver is available for the same channel: if there’s no recipient for the value on ch
, no other value can be put in the channel. And the other way around: no new value can be sent in ch
when the channel is not empty! So the send operation will wait until ch
becomes available again.
2. A receive operation for a channel blocks until a sender is available for the same channel: if there is no value in the channel, the receiver blocks.
This is illustrated in the below example:
package main
import "fmt"
func main() {
ch1 := make(chan int)
go pump(ch1) // pump hangs
fmt.Println(<-ch1) // prints only 0
}
func pump(ch chan int) {
for i:= 0; ; i++ {
ch <- i
}
}
Because there is no receiver the goroutine hangs and print only the first number.
To workaround this we need to define a new goroutine which reads from the channel in an infinite loop.
func receive(ch chan int) {
for {
fmt.Println(<- ch)
}
}
Then in main()
:
func main() {
ch := make(chan int)
go pump(ch)
receive(ch)
}