Что такое Semaphore

«Что такое Semaphore» — вопрос из категории Golang, который задают на 23% собеседований Golang Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Семафор — это механизм синхронизации, который ограничивает доступ к ресурсу. В 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). В отличие от мьютекса, семафор позволяет нескольким горутинам получать доступ к ресурсу одновременно.