go - 关闭 channel 与发送例如一个空结构?

标签 go channel goroutine

我有一个管道,其中的 goroutine 通过 channel 连接,这样每个 goroutine 都会触发另一个 goroutine,直到所有 goroutine 都运行完毕。更简单地说,想象两个 goroutine AB,这样当 A 完成时,它应该告诉 B 它可以运行。

它工作正常,我尝试了一些变体,因为我了解了更多关于 pipelines in Go 的信息。 .

目前我有一个信令 channel

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)
    ...
}

这工作正常,我也尝试过在 A() 中发送一个空结构 struct{},而不是关闭。

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

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

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

也许有一种惯用的 Go 方法可以做到这一点?

感谢您对此的任何澄清!

最佳答案

关闭 channel 表示该 channel 上将不再有任何发送。这通常是更好的选择,因为如果无意中发送或关闭(编程错误),您会在该点之后感到 panic 。 close 还可以向多个接收者发出信号,表明不再有消息,而仅通过发送哨兵值无法轻松协调这些消息。

Naturally, sending any other type in the channel takes up "some" amount of memory, but how is it with the empty struct?

无法保证它确实会在无缓冲 channel 中占用任何额外的内存(这完全是一个实现细节)。发送会阻塞,直到接收可以继续为止。

Close is just part of the channel so not "sent" as such even if information is passed between goroutines.

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

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

  • 如果您需要向一个接收者发送信号,请发送一个哨兵值,并保持 channel 打开以发送更多值。

  • 如果这是最终消息,请关闭 channel ,可能会向多个接收者发出信号,并且再次发送或关闭将出错。

关于go - 关闭 channel 与发送例如一个空结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29353040/

相关文章:

依赖轮询器一直运行的Go应用,保证其稳定性的建议

go - 如何从 Go channel 获取(和忽略)一个值

goroutine 死锁 : In an app that reads from a blockchain and writes to rethinkdb, 有

go - 没有收到来自 channel 的消息

go - 如何实现单例

go - 如何同步常量写入和周期性读取和更新

go - 检测 Go 例程中断

go - Go 中的 float 精度

go - 如何从Golang的*fasthttp.Request中获取头部内容?

go - 如何在 Golang 的回调中使用接口(interface)?