У меня есть 8 горутин, в каждой из которых создается структура с подключением.
Если в одном подключении возникла непредвиденная ошибка, мне необходимо закрыть это подключение и сообщить остальным подобным структурам, чтобы они тоже закрылись.
Как это сделать?
У меня получилось такое решение. Но она кажется громоздким.
// Publish is method for use in goroutines
func Publish(in <-chan []byte, goroutines int, config Config) {
done := make(chan bool, goroutines - 1)
stop := make(chan bool, goroutines - 1)
defer func () {
close(done)
close(done)
} ()
var wg sync.WaitGroup
for i := 0; i < goroutines; i++ {
wg.Add(1)
go func(wg *sync.WaitGroup, in <-chan []byte, stop, done chan bool, config Config) {
defer wg.Done()
var conn connect
conn.Init(config)
conn.setDone(done)
conn.setStop(stop)
defer conn.close()
for body := range in {
conn.publishMessage(body)
}
} (&wg, in, stop, done, config)
}
go func (goroutines int, done <-chan bool, stop chan<- bool) {
select {
case <- done:
for i := 0; i < goroutines - 1; i++ {
stop <- true
}
}
} (goroutines, done, stop)
wg.Wait()
}