登录
首页 >  Golang >  Go问答

缓冲通道似乎存储的值比我的缓冲区大小更多

来源:stackoverflow

时间:2024-03-16 19:36:28 300浏览 收藏

**文章首段摘要** 本文探讨了 Go 语言中缓冲通道的特性,并解释了为什么一个缓冲区大小为 2 的通道可以存储看似超过 2 个值。尽管代码中写入通道的次数多于缓冲区大小,但通道不会陷入死锁。这是因为通道中的值被读取,从而释放了缓冲区中的空间,允许写入更多值。这种特性在 Go 语言中被称为“backpressure”,它允许协程之间有效地通信,而不会出现死锁。

问题内容

我目前正在学习频道,并编写了这段代码,预计它会失败,但事实并非如此。这里到底发生了什么?根据我的理解,如果缓冲区大小为 2,那么我应该一次只能存储 2 个值而不会陷入死锁。我是否立即失去了基本的理解?

c := make(chan int, 2)

go func() {
    c <- 1
    c <- 2
    c <- 3
    c <- 4
    c <- 5
    c <- 6
}()

fmt.println(<-c)
...
fmt.println(<-c)

因此,经过思考,一旦内存因某种原因解锁,通道可能会填充 2 个值,并同时执行每个 println(<-c) 。我编写了下一个片段,试图阻止这种情况发生并导致死锁错误,并且它也运行了。

c := make(chan int, 2)

go func() {
    c <- 1
    c <- 2
    c <- 3
    c <- 4
    c <- 5
    c <- 6
}()

fmt.Println(<-c, <-c, <-c, <-c, <-c, <-c)

为什么这个缓冲通道似乎允许我在其中存储两个以上的值,如果我对通道的基本理解不正确,有人可以引导我找到一个好的来源来纠正它吗?


正确答案


它只存储两个值。 goroutine开始运行,并逐一写入通道。但与此同时,主协程也在运行,并从通道读取数据。您读取的内容足以消耗通道中的所有值,因此不会出现死锁。

终于介绍完啦!小伙伴们,这篇关于《缓冲通道似乎存储的值比我的缓冲区大小更多》的介绍应该让你收获多多了吧!欢迎大家收藏或分享给更多需要学习的朋友吧~golang学习网公众号也会发布Golang相关知识,快来关注吧!

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