Senior
33
How can goroutine leaks happen and how do you prevent them?
Сұралған компаниялар
AI-дан жауап
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)
}
}
}