Sobes.tech
Senior
28

How can goroutine leaks happen and how do you prevent them?

Компании, где спрашивали
AndersenAndersen

Ответ от нейросети

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)
        }
    }
}