Senior
28
How can goroutine leaks happen and how do you prevent them?
Компании, где спрашивали
Ответ от нейросети
sobes.tech AI
Утечки goroutine происходят, когда горутина запускается, но никогда не завершается, например, из-за ожидания на канал, который никогда не получит данные, или бесконечного цикла без выхода.
Причины утечек:
- Горутинa ждет чтения или записи в канал, который никто не закрывает или не пишет в него.
- Использование блокирующих операций без таймаутов или контекстов.
- Неправильное управление жизненным циклом горутин.
Как предотвратить:
- Использовать контекст (context.Context) с отменой, чтобы сигнализировать горутине о необходимости завершения.
- Закрывать каналы, когда они больше не нужны.
- Добавлять таймауты или дедлайны для операций, которые могут блокироваться.
- Следить за количеством активных горутин и использовать профилирование (pprof) для обнаружения утечек.
Пример с контекстом:
func worker(ctx context.Context, jobs <-chan Job) {
for {
select {
case <-ctx.Done():
return // Завершаем горутину при отмене контекста
case job, ok := <-jobs:
if !ok {
return // Канал закрыт, завершаем
}
process(job)
}
}
}