【问题标题】:Go Channel in the child routines子例程中的 Go Channel
【发布时间】:2018-12-21 09:16:56
【问题描述】:

在 Go 编程中创建频道的最佳做法是什么?为了组织和清晰,您是否应该在主程序中创建所有通道?

我已经查看了在子例程中创建通道的 go 代码。在子例程中创建主例程时,这些通道是否禁止进入主例程?

请澄清。提前致谢。

【问题讨论】:

  • Goroutines 与线程不同;这些术语不可互换。
  • 在哪里创建频道并不重要。通常它会被创建然后传递给一个函数,因为go someFunc() 无法向调用go 的例程返回任何东西(在传统意义上),所以这样做更容易。没有什么可以阻止 goroutine 创建通道并通过它与main() 通信,这样做会按预期工作。
  • Go 有 goroutine,没有线程,它们之间没有父子关系。通道只是值,它们与 goroutine 没有任何关系。

标签: go concurrency channel


【解决方案1】:

任何 goroutine 都可以与任何通道在其范围内进行交互,就像任何其他变量一样。在哪里创建频道并不重要。然而,重要的是通过线程进行通信的 goroutine 都具有对通道的引用。

“分叉”或“父”goroutine 通常创建通道的原因是,如果子程序创建了通道,它就没有任何方式与父程序共享它。考虑:

go func(){
  ch := make(chan int)
}
// how would we refer to `ch` out here?

谁创建频道并不重要,没有频道“所有权”的概念。但是写入通道的 goroutine 确实需要引用它,这就是为什么它在“父”线程中创建并与 goroutine 传递或共享的原因。否则,父母将无法从孩子那里获取频道(您可以在频道中传递频道,但这证明了这一点!)

【讨论】:

    【解决方案2】:

    我在Go recommend articles 学到了很多关于并发模型的知识。而且我知道在不同情况下同时在哪里创建频道。

    例如,在 Pipeline 模型中,在上游阶段创建一个通道,并将其传递给一个匿名的 go 例程。上游阶段结束后,可以关闭通道。

    我希望这些文章对您有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-09-08
      • 1970-01-01
      • 2019-02-13
      • 2012-01-04
      • 1970-01-01
      • 2019-03-22
      • 2021-10-08
      • 2019-06-27
      相关资源
      最近更新 更多