Multiple receivers on a single channel. Who gets the data?

前端 未结 3 459
不思量自难忘°
不思量自难忘° 2021-01-04 03:54

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

3条回答
  •  说谎
    说谎 (楼主)
    2021-01-04 04:02

    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)
    }
    

提交回复
热议问题