Несколько продюсеров закрывают один и тот же канал
Из нескольких источников события сливаются в один канал:
results := make(chan Event)
for _, src := range sources {
go func(s Source) {
for _, e := range s.Read() {
results <- e
}
close(results)
}(src)
}
for e := range results {
handle(e)
}
Сервис периодически падает с panic: send on closed channel. Как правильно исправить?
- Закрывать канал в потребителе после выхода из `range` — тогда продюсеры не конфликтуют
- Убрать `close` из продюсеров и закрывать канал один раз в отдельной горутине после `wg.Wait()`
- Добавить каналу буфер — при буферизации `close` становится безопасным
- Обернуть `close(results)` в `sync.Once` в каждой горутине — повторное закрытие станет безвредным
