关闭通道与发送例如空结构?

我有一个由通道连接的 goroutine 的管道,这样每个 goroutine 将触发另一个 goroutine,直到所有 goroutine 都运行完毕。把更简单,假设有两个够程A和B,这样,当A完成它应该告诉B它可以运行。


它运行良好,我尝试了一些变体,因为我对Go 中的管道有了更多的了解。


目前我有一个信令通道


ch := make(chan struct{})

go A(ch)

go B(ch)

...

这B在块


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

    <-ch

    ...

并A在完成后关闭


func A(ch chan struct{}) {

    defer close(ch)

    ...

}

这工作正常,我也尝试过,而不是关闭,struct{}在A().


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


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


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


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


感谢您对此的任何澄清!


呼啦一阵风
浏览 162回答 2
2回答

慕侠2389804

关闭通道表示该通道上将不再有发送。这通常是可取的,因为在无意发送或关闭(编程错误)的情况下,您会在该点之后出现恐慌。Aclose还可以向多个接收器发出信号,表示没有更多消息,您无法通过发送标记值来轻松协调。自然地,在通道中发送任何其他类型会占用“一些”内存,但是空结构体如何?不能保证它会在无缓冲通道中占用任何额外的内存(这完全是一个实现细节)。发送阻塞,直到接收可以继续。关闭只是通道的一部分,因此即使信息在 goroutines 之间传递,也不会“发送”。这里没有优化,close只是可以发送到频道的另一种类型的消息。每个结构都有明确的含义,您应该使用适当的含义。如果您需要向一个接收器发送信号,请发送一个哨兵值,并保持通道打开以发送更多值。如果这是最终消息,则关闭通道,可能会向多个接收器发出信号,再次发送或关闭将是错误的。

米脂

您可以通过多个 goroutine 从封闭通道接收数据,它们永远不会阻塞。这是一个主要优势。这是one_to_many 模式。finish := make(chan struct{})当许多并发运行者想要报告已完成的事情时,可以在many_to_one模式中使用,而局外人则不会panic。这与内存消耗无关。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go