Buffered channel размером N работает как семафор: можно записать N значений без блокировки, N+1 заблокируется. Захват: ch <- struct{}{}, освобождение: <-ch. Это самый простой и идиоматичный способ ограничить параллелизм в Go. Нет внешних зависимостей, понятно каждому гоферу. Для weighted semaphore (разные операции стоят по-разному) — golang.org/x/sync/semaphore с Acquire(ctx, weight). Но для большинства задач buffered channel — то что нужно.
Что такое semaphore через buffered channel?
Middle
257 просмотровAFK Offer AI
Как ограничить concurrent requests?