Забытый 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`
