【问题标题】:Why does Go uses channels to send and receive data between goroutines instead of using normal variables?为什么 Go 使用通道在 goroutine 之间发送和接收数据,而不是使用普通变量?
【发布时间】:2021-09-29 17:08:17
【问题描述】:

除了 Wikipedia https://en.wikipedia.org/wiki/Channel_(programming) 的解释外,我找不到任何关于这个问题的信息。但我对这个解释并不满意。

渠道解决了什么问题? 我们为什么不直接使用普通变量来发送和接收数据呢?

【问题讨论】:

标签: go goroutine


【解决方案1】:

如果您所说的“普通变量”是指,例如,多个 goroutine 写入和读取的切片,那么这是一种保证数据竞争的方式(您不想获得数据竞争)。您可以通过使用某种同步(例如 Mutex 或 RWLock)来避免并发访问。

此时,你

  1. 重新发明的通道(基本上就是互斥体下的一个切片)
  2. 花费的时间比您需要的多,但您的解决方案仍然较差(没有语法支持,您不能在 select 中使用切片等)

【讨论】:

    【解决方案2】:

    Channels 解决了并发读写的问题。基本上,防止一个 goroutine 读取一个变量而另一个 goroutine 写入同一个变量的情况。

    通道也可能有缓冲区,因此您可以在锁定之前写入多个值。

    当然,您不必使用频道。还有其他方法可以在 goroutine 之间发送数据。例如,您可以在从共享变量中分配或读取值时使用原子操作,或者在访问时使用互斥锁。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-20
      • 2011-12-26
      • 2013-01-25
      • 2017-09-20
      • 2023-02-09
      • 1970-01-01
      相关资源
      最近更新 更多