Контроль утечек горутин через context и errgroup

Практические лайфхаки для разработчиков, DevOps и админов: Docker, Linux, Bash, Python, Golang, Ansible, логи и безопасность — только рабочие решения. Даем готовые команды, конфиги и приёмы диагностики, которые экономят часы и дни. Если нужно быстро настроить, отладить и обезопасить инфраструктуру — вы по адресу.

gogoroutinescontext

👁 В проде утечки горутин — это не абстрактная проблема, а тихий убийца памяти и файловых дескрипторов. Особенно часто это происходит, когда одна из параллельных задач падает, а остальные продолжают жить своей жизнью. Решение — централизованная отмена через context и координация через errgroup.

📝 Управление конкурентными задачами с корректной отменой

package main

import (
  "context"
  "fmt"
  "net/http"
  "time"

  "golang.org/x/sync/errgroup"
)

func main() {
  ctx, cancel := context.WithTimeout(context.Background(), 3*time.Second)
  defer cancel()

  g, ctx := errgroup.WithContext(ctx)

  urls := []string{
    "https://service1.local",
    "https://service2.local",
  }

  for _, url := range urls {
    url := url
    g.Go(func() error {
      req, _ := http.NewRequestWithContext(ctx, http.MethodGet, url, nil)
      resp, err := http.DefaultClient.Do(req)
      if err != nil {
        return err
      }
      defer resp.Body.Close()
      fmt.Println(url, resp.StatusCode)
      return nil
    })
  }

  if err := g.Wait(); err != nil {
    fmt.Println("ошибка:", err)
  }
}

📌 Как это работает:

  • errgroup.WithContext автоматически отменяет общий контекст, если любая горутина возвращает ошибку.
  • Все HTTP-запросы привязаны к этому контексту, поэтому при отмене они корректно прерываются.
  • g.Wait() гарантирует, что мы не выйдем из main, пока все горутины не завершатся.

❗️ Такой подход защищает от висящих горутин, зависших запросов и неконтролируемого роста ресурсов. В сервисах с параллельными запросами или fan-out архитектурой это не «красота кода», а базовая гигиена продакшена.

tags: #go #разработка #автоматизация

🧭 @recura_tech 🌐 VK 🌐 MAX

Скриншот тёмной темы с фрагментом кода Go (errgroup и context) на фоне фирменного паттерна RECURA и логотипом канала
Скриншот примера кода из поста: использование errgroup и context для отмены параллельных HTTP-запросов.

Читайте так же