【问题标题】:Do buffered channels maintain order?缓冲通道是否维持秩序?
【发布时间】:2014-11-05 20:32:56
【问题描述】:

在 Go 中,缓冲通道有顺序保证吗?

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

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

【问题讨论】:

标签: go channel


【解决方案1】:

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

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


您可以在 William Kennedy(2014 年 2 月)的“The Nature Of Channels In Go”中看到通道的概念:它显示了如何尊重顺序或读/写。
另见Channels

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

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

无缓冲通道

缓冲通道

图片来源:Ardan labs - William Kennedy


William Kennedy 在“The Behavior Of Channels”(2017 年 10 月)

中详细介绍了交付保证方面

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

图片来源:Ardan labs - William Kennedy

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

  • 保证

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

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

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

【讨论】:

  • 很好地使用图像来解释概念!
  • A 是或否表示“您是否保证 B 将按照 A 将数据放入通道的相同顺序读取数据?”对于这部分,他会有所帮助。不过答案很好。
  • @sofs1 好点。我在答案中添加了第一部分,以使其更加明确。但我也指出,交付本身并不总是得到保证。
  • @VonC 你太棒了。
猜你喜欢
  • 2014-07-14
  • 1970-01-01
  • 2016-06-20
  • 2017-12-23
  • 1970-01-01
  • 2020-04-09
  • 2014-01-30
  • 2017-10-19
  • 2018-11-08
相关资源
最近更新 更多