Sobes.tech
Назад к вопросам
Senior
6

Как не дожидаться завершения всех горутин при первой ошибке в ErrGroup?

Компании, где спрашивали
plata

Ответ от нейросети

sobes.tech AI

В стандартном пакете errgroup при первой ошибке горутины ErrGroup не прерывает остальные горутины — он ждёт завершения всех.

Чтобы не дожидаться завершения всех горутин при первой ошибке, можно использовать контекст с отменой (context.WithCancel). При возникновении ошибки вызываем cancel(), и остальные горутины должны слушать контекст и завершаться сами.

Пример:

import (
    "context"
    "golang.org/x/sync/errgroup"
)

func runTasks(ctx context.Context) error {
    ctx, cancel := context.WithCancel(ctx)
    defer cancel()

    g, ctx := errgroup.WithContext(ctx)

    g.Go(func() error {
        // пример задачи
        if err := doSomething(ctx); err != nil {
            cancel() // отменяем остальные
            return err
        }
        return nil
    })

    g.Go(func() error {
        // другая задача
        return doAnotherThing(ctx)
    })

    return g.Wait()
}

Важный момент — внутри горутин нужно периодически проверять ctx.Done(), чтобы корректно завершаться при отмене.