Ограничение параллели через worker pool в Go

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

goworker poolпараллелизм

👁 В задачах автоматизации на Go часто возникает соблазн запустить всё «в параллель» — особенно при обработке очередей, API или файлов. В итоге легко получить перегрузку CPU, сети или внешнего сервиса. Правильнее контролировать параллелизм через worker pool.

📝 Реализация worker pool с ограничением нагрузки

package main

import (
  "fmt"
  "sync"
)

func worker(id int, jobs <-chan int, wg *sync.WaitGroup) {
  defer wg.Done()
  for job := range jobs {
    fmt.Printf("worker %d обрабатывает %d\n", id, job)
  }
}

func main() {
  jobs := make(chan int, 10)
  var wg sync.WaitGroup

  for w := 1; w <= 3; w++ {
    wg.Add(1)
    go worker(w, jobs, &wg)
  }

  for j := 1; j <= 10; j++ {
    jobs <- j
  }
  close(jobs)

  wg.Wait()
}

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

  • Создаётся фиксированное количество воркеров, которые читают задачи из канала.
  • Канал jobs выступает как очередь, распределяя задачи между горутинами.
  • Такой подход ограничивает параллелизм и защищает систему от перегрузки.

❗️ Worker pool — базовый паттерн для автоматизации в Go. Он позволяет держать нагрузку под контролем и избегать ситуаций, когда «параллельность ради скорости» убивает стабильность системы.

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

🧭 @recura_tech 🌐 VK 🌐 MAX

Скриншот кода на Go: пример worker pool с каналом jobs и воркерами на тёмном фоне с логотипом RECURA, демонстрирующий реализацию паттерна.
Пример кода worker pool в Go: фиксированное число воркеров, очередь jobs и ожидание wg.Wait().

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