Ответ
Семафор — это механизм синхронизации, который ограничивает доступ к ресурсу. В Go его можно реализовать через буферизованный канал.
Пример:
type Semaphore chan struct{}
func NewSemaphore(n int) Semaphore {
return make(chan struct{}, n)
}
func (s Semaphore) Acquire() {
s <- struct{}{}
}
func (s Semaphore) Release() {
<-s
}
Использование:
sem := NewSemaphore(3) // максимум 3 горутины
for i := 0; i < 10; i++ {
go func() {
sem.Acquire()
defer sem.Release()
// работа с ресурсом
}()
}
Семафоры полезны для ограничения количества одновременных операций (например, запросов к API). В отличие от мьютекса, семафор позволяет нескольким горутинам получать доступ к ресурсу одновременно.
Видео-ответы
▶
▶