Логотип YeaHub

База вопросов

Собеседования

Тренажёр

База ресурсов

Обучение

Навыки

Задачи

Войти

Выбери, каким будет IT завтра — вместе c нами!

YeaHub — это полностью открытый проект, призванный объединить и улучшить IT-сферу. Наш исходный код доступен для просмотра на GitHub. Дизайн проекта также открыт для ознакомления в Figma.

© 2026 YeaHub

AI info

Карта сайта

Документы

Медиа

Назад
Вопрос про Golang: concurrency, semaphore, goroutine

Как реализовать параллельную обработку с ограничением количества горутин?

Вопрос проверяет навыки работы с горутинами.

Короткий ответ

Можно использовать семафор, реализованный через канал. Создаётся буферизированный канал, куда помещаются маркеры при запуске новой горутины, и освобождаются при завершении.

Длинный ответ

В Go для ограничения числа одновременно выполняемых горутин часто используют семафор, реализованный через буферизированный канал (chan struct{}).

Принцип работы:

  1. Создаём канал sema := make(chan struct{}, N) — где N это максимально допустимое количество одновременных горутин.

  2. Перед запуском каждой горутины записываем пустую структуру в канал.

  3. По завершению горутина читает из канала, освобождая слот.

Пример:

sema := make(chan struct{}, 10) // максимум 10 горутин

for _, task := range tasks {
    sema <- struct{}{}
    go func(task Task) {
        defer func() { <-sema }()
        process(task)
    }(task)
}

Этот подход:

  • Лаконичен

  • Безопасен

  • Подходит для любых задач с ограничением по ресурсу (CPU, соединениям и т.д.)

Альтернатива — реализация через worker pool, где фиксированное количество воркеров получают задания через канал.

  • Аватар

    Golang Guru

    Maxim Lukyanov

    Guru – это эксперты YeaHub, которые помогают развивать комьюнити.

Уровень

  • Рейтинг:

    5

  • Сложность:

    6

Навыки

  • Golang

    Golang

Ключевые слова

#concurrency

#semaphore

#goroutine

Подпишись на Golang Developer в телеграм

  • Аватар

    Golang Guru

    Maxim Lukyanov

    Guru – это эксперты YeaHub, которые помогают развивать комьюнити.