为了账号安全,请及时绑定邮箱和手机立即绑定

多个 goroutine 监听一个通道

多个 goroutine 监听一个通道

Go
猛跑小猪 2021-06-03 18:38:40
我有多个 goroutine 试图同时在同一个频道上接收。似乎在通道上开始接收的最后一个 goroutine 获得了值。这是语言规范中的某个地方还是未定义的行为?c := make(chan string)for i := 0; i < 5; i++ {    go func(i int) {        <-c        c <- fmt.Sprintf("goroutine %d", i)    }(i)}c <- "hi"fmt.Println(<-c)输出:goroutine 4
查看完整描述

3 回答

?
慕标琳琳

TA贡献1830条经验 获得超9个赞

Effective Go解释了这个问题:


接收器总是阻塞直到有数据要接收。


这意味着您不能有超过 1 个 goroutine 监听 1 个通道并期望所有 goroutine 都收到相同的值。


运行此代码示例。


package main


import "fmt"


func main() {

    c := make(chan int)


    for i := 1; i <= 5; i++ {

        go func(i int) {

        for v := range c {

                fmt.Printf("count %d from goroutine #%d\n", v, i)

            }

        }(i)

    }


    for i := 1; i <= 25; i++ {

        c<-i

    }


    close(c)

}

即使有 5 个 goroutine 正在侦听通道,您也不会多次看到“count 1”。这是因为当第一个 goroutine 阻塞通道时,所有其他 goroutine 必须排队等待。当通道解除阻塞时,计数已经被接收并从通道中移除,因此下一个 goroutine 获得下一个计数值。


查看完整回答
反对 回复 2021-06-07
  • 3 回答
  • 0 关注
  • 339 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信