Как выйти, когда первая ошибка возникает для одной из программ в группе ожидания? - PullRequest
1 голос
/ 30 апреля 2020
func getRecords(ctx context.Context, ids *[]Id) error {
    ctx, cancel := context.WithTimeout(ctx, DefaultTimeout)
    defer cancel()

    var wg sync.WaitGroup
    size := len(*ids)
    allErrors := make(chan error, size)

    for i := 0; i < size; i++ {
        wg.Add(1)

        go func(x int){
            err := //call to other func which return error type. nil or error
            if err != nil { // I will be creating n goroutines. How to exit rightaway if one of 
                            // them return error
                allErrors <- err 
            }
            wg.Done()
        }(i)
    }

    go func() {
        wg.Wait()
        close(allErrors)
    }
    return nil
}

Как выйти на анонимную функцию здесь?

1 Ответ

3 голосов
/ 30 апреля 2020

Вам нужно использовать ErrGroup

Это то, что ErrGroup. Go Делает

Первый вызов, чтобы вернуть ненулевую ошибку отменяет группа; его ошибка будет возвращена функцией Wait.

Таким образом, другие процедуры будут автоматически отменены, если возникнет какая-либо ошибка возврата.

Использование:

errs, ctx = errgroup.WithContext(ctx)

for i := 0; i < size; i++ {
    errs.Go( func() error{
        ...
    })
}

if err := g.Wait(); err != nil {
    // Handle Errors from GoRoutines
}
...