Взвешенный семафор — это расширение классического семафора, который ограничивает количество одновременно выполняющихся операций. В отличие от обычного семафора, где каждый запрос занимает один ресурс (единицу), взвешенный семафор позволяет запросам занимать разное количество ресурсов (вес).
Знаешь ли ты понятие взвешенный семафор? Что это такое?
Взвешенный семафор — это расширение классического семафора, который ограничивает количество одновременно выполняющихся операций.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Взвешенный семафор — это расширение классического семафора, который ограничивает количество одновременно выполняющихся операций. В отличие от обычного семафора, где каждый запрос занимает один ресурс (единицу), взвешенный семафор позволяет запросам занимать разное количество ресурсов (вес).
Например, если у вас есть ограничение на 10 единиц ресурсов, один запрос может занимать 3 единицы, другой — 5, и так далее. Семафор блокирует новые запросы, если суммарный вес занятых ресурсов достигает лимита.
В Go это удобно для контроля параллелизма с разной «стоимостью» задач. В стандартной библиотеке есть golang.org/x/sync/semaphore, который реализует взвешенный семафор.
Пример:
import (
"context"
"golang.org/x/sync/semaphore"
)
func main() {
sem := semaphore.NewWeighted(10) // лимит 10 единиц
ctx := context.Background()
// Запрос занимает 3 единицы
if err := sem.Acquire(ctx, 3); err != nil {
// обработка ошибки
}
// ... работа
sem.Release(3)
}