Sobes.tech
Senior
33

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

Сұралған компаниялар
AndersenAndersen

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