关闭频道与发送例如一个空的结构?

关闭频道与发送例如一个空的结构?

问题描述:

我有一个通道连接的通道,所以每个goroutine都会触发另一个直到所有的通道都运行。放得更简单,想象两个门店AB,以便当A完成后,它应该告诉B它可以运行。关闭频道与发送例如一个空的结构?

这工作正常,我已经尝试了几个变种,因为我已经了解了更多关于pipelines in Go

目前,我有一个信令信道

ch := make(chan struct{}) 
go A(ch) 
go B(ch) 
... 

func B(ch <-chan struct{}) { 
    <-ch 
    ... 

AB块做

func A(ch chan struct{}) { 
    defer close(ch) 
    ... 
} 

能正常工作的时候,我也试过关闭,而不是关闭,发送一个空的结构struct{} i n A()

关闭通道或发送空结构有什么区别吗?无论哪种方式更便宜/更快/更好?

当然,在通道中发送任何其他类型会占用“一些”内存量,但它如何与空的结构?关闭只是通道的一部分,因此即使信息在goroutine之间传递,也不会“发送”。

我很清楚过早的优化。这只是为了理解事情,而不是优化任何事情。

也许有一种惯用的Go方式来做到这一点?

感谢您对此的任何澄清!

关闭通道表示该通道上不会有更多的发送。这通常是可取的,因为在无意发送或关闭(编程错误)的情况下,您会在此之后发生恐慌。 A close也可以向多个接收器发送信号,表明没有更多的消息,通过发送哨兵值你不能很容易地进行协调。

自然地,在通道中发送任何其他类型占用“一些”内存量,但它是如何与空的结构?

不能保证它在一个无缓冲的通道中占用额外的内存(这完全是一个实现细节)。发送阻塞直到接收可以继续。

关闭只是通道的一部分,因此即使信息在goroutine之间传递,也不会如此“发送”。

这里没有优化,close只是可以发送到频道的另一种类型的消息。

每个结构都有明确的含义,您应该使用适当的结构。

  • 如果您需要发信号通知一个接收器,并保持通道打开以发送更多值,则发送一个标记值。

  • 关闭信道,如果这是最后的消息,可能信号的多个接收器,并且这将是再次发送或接近一个错误。

+0

感谢您的回答。我知道什么关闭意味着什么,并且询问'close(ch)'和'ch murrekatt 2015-03-30 18:15:03

+0

@murrekatt:'close'是一个合乎逻辑的消息,该承诺没有更多的价值将被送到你认为什么是消息的特殊值?发送和关闭都只是操纵通道的内部状态,导致将值发送到接收器。 – JimB 2015-03-30 18:32:17

+0

我在Go的源代码中查看了什么'close',并且它设置了一个标志,指示通道已关闭。 – murrekatt 2015-03-31 07:45:09

您可以从多个goroutines从封闭的渠道接收,他们将永远不会阻止。这是一个主要优势。这是one_to_many模式

finish := make(chan struct{})可以many_to_one模式时使用多个并发选手要举报的东西做的,外人不会panic

这不是内存消耗。

+0

@Uvelichtiel你会不会用一个等待组信号多对一完成? – murrekatt 2015-03-31 07:46:30

+0

@murrekatt同步等待用于等待所有组。但是你可以只对胜利者完成感兴趣。在这种情况下,赢家不应该关闭频道,以便外部人不会在封闭频道上发出恐慌。运动员应该仅向裁判员表示他们已经完成并裁判员反过来关闭比赛。 – Uvelichitel 2015-03-31 11:53:11