在子例程中进入频道

时间:2018-12-20 18:08:05

标签: go concurrency channel

在go编程中创建频道的最佳实践是什么?为了组织清楚,您是否应在主例程中创建所有渠道?

我已经查看了在子例程中创建通道的go代码。在子例程中创建主例程时,这些通道是否超出了主例程的范围?

请澄清。预先感谢。

2 个答案:

答案 0 :(得分:6)

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

“派生”或“父” goroutine通常创建通道的原因是,如果子级创建了该通道,则它将无法与父级共享。考虑:

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

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

答案 1 :(得分:1)

我在Go recommend articles中了解了很多有关并发模型的知识。而且我了解了如何同时在不同情况下创建渠道。

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

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