为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
呼啦一阵风 2021-09-27 15:35:52
我有一个由通道连接的 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 方式来做到这一点?感谢您对此的任何澄清!
查看完整描述

2 回答

?
慕侠2389804

TA贡献1719条经验 获得超6个赞

关闭通道表示该通道上将不再有发送。这通常是可取的,因为在无意发送或关闭(编程错误)的情况下,您会在该点之后出现恐慌。Aclose还可以向多个接收器发出信号,表示没有更多消息,您无法通过发送标记值来轻松协调。

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

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

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

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

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

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

  • 如果这是最终消息,则关闭通道,可能会向多个接收器发出信号,再次发送或关闭将是错误的。


查看完整回答
反对 回复 2021-09-27
?
米脂

TA贡献1836条经验 获得超3个赞

您可以通过多个 goroutine 从封闭通道接收数据,它们永远不会阻塞。这是一个主要优势。这是one_to_many 模式

finish := make(chan struct{})当许多并发运行者想要报告已完成的事情时,可以在many_to_one模式中使用,而局外人则不会panic

这与内存消耗无关。


查看完整回答
反对 回复 2021-09-27
  • 2 回答
  • 0 关注
  • 161 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信