Логотип YeaHub

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

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

Тренажёр

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

Обучение

Навыки

Задачи

Войти

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

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

© 2026 YeaHub

AI info

Карта сайта

Документы

Медиа

Назад
Вопрос про Node.js: buffered channels, rate limiter, semaphore, worker pool, Go concurrency

Для каких паттернов обычно используют буферизированные каналы (rate limiter, семафор, worker pool)?

Вопрос проверяет понимание применения буферизированных каналов в Go для реализации паттернов синхронизации и ограничения параллелизма.

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

Буферизированные каналы в Go используются для ограничения количества одновременно выполняемых горутин. Паттерн rate limiter контролирует частоту запросов, семафор ограничивает доступ к ресурсу, а worker pool распределяет задачи между фиксированным числом воркеров. Буфер позволяет отправителю не блокироваться сразу, а получателю — обрабатывать данные пачками.

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

Буферизированные каналы в Go

Буферизированные каналы — это каналы с фиксированной ёмкостью, которые позволяют отправлять данные без блокировки, пока буфер не заполнен. Они идеально подходят для паттернов, где нужно контролировать параллелизм или сглаживать нагрузку.

Rate Limiter (ограничитель скорости)

Используется для ограничения количества операций в единицу времени. Буферизированный канал выступает в роли счётчика токенов: горутина отправляет токен перед выполнением, а после завершения — читает его. Если буфер полон, отправка блокируется, пока не освободится место.

tokens := make(chan struct{}, 3) // максимум 3 одновременных запроса
for i := 0; i < 10; i++ {
    go func(id int) {
        tokens <- struct{}{} // захват токена
        defer func() { <-tokens }() // освобождение
        fmt.Println("Request", id)
        time.Sleep(100 * time.Millisecond)
    }(i)
}

Семафор

Семафор ограничивает доступ к общему ресурсу. Буферизированный канал с ёмкостью N работает как семафор: горутина отправляет значение, чтобы "захватить" слот, и читает, чтобы "освободить". Это гарантирует, что не более N горутин одновременно работают с ресурсом.

sem := make(chan struct{}, 2) // семафор на 2 слота
for _, task := range tasks {
    go func(t Task) {
        sem <- struct{}{}
        defer func() { <-sem }()
        process(t)
    }(task)
}

Worker Pool (пул воркеров)

Пул воркеров создаёт фиксированное число горутин, которые читают задачи из общего канала. Буферизированный канал для задач позволяет накапливать запросы, пока воркеры заняты. Это предотвращает потерю данных и сглаживает пиковую нагрузку.

jobs := make(chan Job, 100) // буфер на 100 задач
for w := 0; w < 5; w++ {
    go worker(jobs)
}
for _, job := range jobList {
    jobs <- job
}
close(jobs)

Вывод: Буферизированные каналы применяются везде, где нужно контролировать параллелизм: от веб-серверов (лимит запросов) до обработки данных (пул воркеров). Они делают код безопасным и предсказуемым, избегая перегрузки системы.

  • Аватар

    Golang Guru

    Maxim Lukyanov

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

Уровень

  • Рейтинг:

    4

  • Сложность:

    6

Навыки

  • Node.js

    Node.js

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

#buffered channels

#rate limiter

#semaphore

#worker pool

#Go concurrency

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

  • Аватар

    Golang Guru

    Maxim Lukyanov

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