@oke11o

Как сообщить стурктурам об ошибке в одной из них?

У меня есть 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()
}
  • Вопрос задан
  • 164 просмотра
Решения вопроса 1
bitver
@bitver
Так это одно из первых, что нужно знать при конкурентном коде, юзайте контекст:
например, родной - https://godoc.org/golang.org/x/net/context
Или есть другие реализации, но их ещё понять нужно, стандартный попроще.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы