У меня есть конвейер с горутинами, соединенными каналами, так что каждая горутина запускает другую, пока все не запустятся. Проще говоря, представьте две горутины 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()
.
Есть ли разница между закрытием канала или отправкой пустой структуры? В любом случае дешевле / быстрее / лучше?
Естественно, отправка любого другого типа в канале занимает «некоторое» количество памяти, но как обстоят дела с пустой структурой? Close - это просто часть канала, поэтому она не «отправляется» как таковая, даже если информация передается между горутинами.
Я прекрасно осведомлен о преждевременной оптимизации. Это только для понимания вещей, а не для какой-либо оптимизации.
Может быть, есть идиоматический способ Go сделать это вообще?
Спасибо за любые разъяснения по этому поводу!