【发布时间】:2015-06-03 20:55:12
【问题描述】:
我有一个管道,其中 goroutine 通过通道连接,因此每个 goroutine 都会触发另一个 goroutine,直到所有 goroutine 都运行完毕。更简单地说,想象两个 goroutines A 和 B 这样当 A 完成时它应该告诉 B 它可以运行。
它运行良好,我尝试了一些变体,因为我对pipelines in 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)
...
}
这很好用,我也尝试过,而不是关闭,而是在 A() 中发送一个空结构 struct{}。
关闭通道和发送空结构体有什么区别吗?哪种方式更便宜/更快/更好?
当然,在通道中发送任何其他类型都会占用“一些”内存,但是空结构体又如何呢?关闭只是通道的一部分,因此即使信息在 goroutine 之间传递,也不会“发送”。
我很清楚过早的优化。这只是为了理解事物,而不是优化任何事物。
也许还有一种惯用的 Go 方法可以做到这一点?
感谢您对此的任何澄清!
【问题讨论】: