Основные паттерны — worker pool, pipeline, fan-out/fan-in, producer-consumer и семафор. В Go буферизованный канал можно использовать как счётчик занятых слотов.
Какие паттерны параллельного программирования знаешь? Приведи пример семафора из стандартной библиотеки/практики 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 за секунду.