登录
首页 >  Golang >  Go问答

缓冲通道是否维持秩序?

来源:Golang技术栈

时间:2023-03-10 10:21:43 297浏览 收藏

今天golang学习网给大家带来了《缓冲通道是否维持秩序?》,其中涉及到的知识点包括golang等等,无论你是小白还是老手,都适合看一看哦~有好的建议也欢迎大家在评论留言,若是看完有所收获,也希望大家能多多点赞支持呀!一起加油学习~

问题内容

在 Go 中,缓冲通道是否有任何顺序保证?

例如:你有两个 goroutine A & B 共享一个通道。A 将数据推送到通道上,而 B 从通道中读取数据。您是否保证 B 会按照 A 将数据放入通道的顺序读取数据?

我知道如果有多个生产者或消费者,订单可能是不确定的,但我特别询问只有 1 个生产者和 1 个消费者。

正确答案

“你保证B会按照A放入通道的顺序读取数据吗?”

是的。数据的顺序是有保证的。
但是只有无缓冲通道才能保证 交付, 而不是 缓冲通道。
(请参阅此答案的第二部分)


您可以在William Kennedy[ (2014 年 2 月)的“ The Nature Of Channels In Go](https://www.ardanlabs.com/blog/2014/02/the- nature-of-channels-in-go.html) ”中看到通道的概念:它显示了如何尊重顺序或读/写。 另请参阅频道

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

  • 如果通道没有缓冲,发送方会阻塞,直到接收方收到该值。
  • 如果通道有缓冲区,发送方只会阻塞,直到值被复制到缓冲区;如果缓冲区已满,这意味着要等到某个接收器检索到一个值。

无缓冲通道

https://www.ardanlabs.com/images/goinggo/Screen+Shot+2014-02-16+at+10.10.54+AM.png

缓冲通道

https://www.ardanlabs.com/images/goinggo/Screen+Shot+2014-02-17+at+8.38.15+AM.png

图片来源:[Ardan labs - William Kennedy](https://www.ardanlabs.com/blog/2014/02/the-nature-of-channels-in- go.html)


同一位 William Kennedy在“ [渠道的行为](https://www.ardanlabs.com/blog/2017/10/the- behavior-of-channels.html) ”(2017 年 10 月)中详细介绍了 交付保证 方面

我是否需要保证已收到特定 goroutine 发送的信号?

https://www.ardanlabs.com/images/goinggo/86_signaling_with_data.png

图片来源:再次,Ardan labs - William Kennedy

三个通道选项是 Unbuffered、Buffered >1 或 Buffered =1。

  • 保证

    • 缓冲 通道为您提供了已接收到正在发送的信号 的 保证。
      • 因为信号的 接收发生在信号的发送 完成之前。
  • 无保证

    • 大小 > 1缓冲 通道无法 保证 已接收到正在发送的信号。 ********
      • 因为信号的发送发生在信号 接收 完成之前。
  • 延迟保证

    • 大小 =1缓冲 通道为您提供 延迟保证 。它可以保证之前发送的信号已经被接收到。 ********
      • 因为第 一个信号的接收发生在第二个信号的发送 完成之前。

今天带大家了解了golang的相关知识,希望对你有所帮助;关于Golang的技术知识我们会一点点深入介绍,欢迎大家关注golang学习网公众号,一起学习编程~

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