Какие паттерны параллельного программирования знаешь? Приведи пример семафора из стандартной библиотеки/практики Go и объясни, как канал может использоваться как семафор (захват и освобождение).

Основные паттерны — worker pool, pipeline, fan-out/fan-in, producer-consumer и семафор. В Go буферизованный канал можно использовать как счётчик занятых слотов.

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

Что ответить на собеседовании

Основные паттерны — worker pool, pipeline, fan-out/fan-in, producer-consumer и семафор. В Go буферизованный канал можно использовать как счётчик занятых слотов.

Подробный разбор

Ответ с пояснениями

Основные паттерны — worker pool, pipeline, fan-out/fan-in, producer-consumer и семафор. В Go буферизованный канал можно использовать как счётчик занятых слотов.

Для лимита n > 0:

sem := make(chan struct{}, n)
for _, task := range tasks {
    sem <- struct{}{} // захват до запуска
    wg.Add(1)
    go func(task Task) {
        defer wg.Done()
        defer func() { <-sem }() // освобождение
        process(task)
    }(task)
}
wg.Wait()

Здесь Task, process и wg определяются приложением. Захват до go ограничивает и число ожидающих горутин. Для отменяемого ожидания отправку делают через select с context.Done. Ограничение одновременно работающих задач не равно rate limit за секунду.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее