Загрузка…
Загрузка…
В Go семафор естественным образом моделируется как буферизованный канал фиксированной емкости. Количество слотов в буфере равно максимально допустимому количеству одновременных операций (параллелизм).
Приобрести (занять слот): перед началом работы выполняется горутина ⟦С0⟧. Если буфер заполнен, отправка блокируется.
Release (освободите слот): после завершения горутина выполняется. ⟦С0⟧. Это освобождает место для следующей задачи.
⟦С0⟧
N — лимит одновременно активных задач.
struct{} выбран как облегченный токен без полезной нагрузки.
Простая модель противодавления: повторяющиеся задачи естественным образом ждут.
Прозрачная синхронизация. Среда выполнения Go выполняет блокировку и пробуждение без ручное управление условными переменными.
Хорошо читается в коде: намерение «ограничить параллелизм» сразу бросается в глаза.
Всегда выполняйте release вместо defer, чтобы не потерять слот в случае
error.
Чтобы отменить ожидание, используйте select с context.Done().
Не путайте семафор (ограничение параллелизма) с очередью задач (рабочий бассейн).
Буферизованный канал в Go — это каноническая реализация счетного семафора: простая, надежная и хорошо интегрированная в горутинную модель. Это один из лучших способов контролировать уровень параллелизма в производственных сервисах.
В Go семафор естественным образом моделируется как буферизованный канал фиксированной емкости.
