登录
首页 >  Golang >  Go问答

一些关于golang通道的疑问

来源:stackoverflow

时间:2024-03-09 21:00:30 183浏览 收藏

“纵有疾风来,人生不言弃”,这句话送给正在学习Golang的朋友们,也希望在阅读本文《一些关于golang通道的疑问》后,能够真的帮助到大家。我也会在后续的文章中,陆续更新Golang相关的技术文章,有好的建议欢迎大家在评论留言,非常感谢!

问题内容

我正在 youtube 上观看一个讨论并发模式的视频。 有一个乒乓球示例:

type ball struct{ hits int }
func main() {
    table := make(chan *ball)
    go player("ping", table)
    go player("pong", table)

    table <- new(ball)
    time.sleep(1 * time.second)
    <-table
}

func player(name string, table chan *ball) {
    for {
        ball := <-table
        ball.hits++
        fmt.println(name, ball.hits)
        time.sleep(100 * time.millisecond)
        table <- ball
    }
}

这应该给出结果:

ping 1
pong 2
ping 3
pong 4
...

但是,如果我删除播放器的一个 goroutine,例如“pong”:

// go player("pong", table) // remove this line

我只得到一个结果:

Ping 1

我不明白func播放器中有一个for循环,并且“table”通道将ball提供给ball,在循环结束时,我们将ball放回到通道表中。为什么玩家“ping”不能与自己玩?


解决方案


该通道是无缓冲的,这意味着一个例程必须接收才能完成另一例程的发送。如果删除 pong 播放器,则 ping 播放器将被阻止在通道上发送(pong 无法接收),因此它永远不会移动到循环的下一个迭代来接收自己的消息。

如果要使通道缓冲,如果缓冲区中有空间,则发送将是非阻塞的:table := make(chan *Ball, 1)。这将允许一个球被“保留”在通道的缓冲区中,直到接收者准备好为止。

今天关于《一些关于golang通道的疑问》的内容就介绍到这里了,是不是学起来一目了然!想要了解更多关于的内容请关注golang学习网公众号!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>