Вступить в клуб →
лёгкаявопросКонкурентность: горутины, каналы, context

Забытый wg.Done() в обработчике батча

Сервис разбирает батч задач и в одной из веток возвращается раньше:

var wg sync.WaitGroup
for _, task := range tasks {
    wg.Add(1)
    go func(t Task) {
        if !t.Valid() {
            return // выход без wg.Done()
        }
        process(t)
        wg.Done()
    }(task)
}
wg.Wait()
log.Println("batch done")

Что произойдёт, если в батче есть хотя бы одна невалидная задача?

  • Счётчик обнулится автоматически при завершении горутины — рантайм отслеживает выход из неё
  • `wg.Wait()` заблокируется навсегда: счётчик уменьшает только явный `Done`, а ранний `return` его пропускает
  • `wg.Wait()` вернётся по внутреннему таймауту и запишет предупреждение в лог о незавершённых горутинах
  • Паника `negative WaitGroup counter` при первой же невалидной задаче в батче
  • Невалидные задачи в счётчик не попадут: `Add(1)` учитывает только горутины, дошедшие до `process`

🔒 Проверка ответа — для участников клуба

  • Проверка ответа
  • Подсказка, если застряли
  • Разбор с объяснением, почему так
  • Прогресс по всем задачам и виртуальные собеседования
Зарегистрироваться →

Регистрация занимает минуту

Другие задачи раздела