Назад к вопросам
Senior
4
Расскажи про паттерн Semaphore?
Компании, где спрашивали
sber tech
Ответ от нейросети
sobes.tech AI
Паттерн Semaphore (семафор) — это механизм синхронизации, который ограничивает количество одновременно выполняющихся операций или доступ к ресурсу.
В Go семафор можно реализовать с помощью канала, ограничивая количество горутин, которые могут одновременно выполнять критическую секцию.
Пример простого семафора на Go:
package main
import (
"fmt"
"sync"
"time"
)
func main() {
sem := make(chan struct{}, 3) // семафор с пропускной способностью 3
var wg sync.WaitGroup
for i := 0; i < 10; i++ {
wg.Add(1)
go func(id int) {
defer wg.Done()
sem <- struct{}{} // захват семафора
fmt.Printf("Горутина %d начала работу\n", id)
time.Sleep(1 * time.Second) // имитация работы
fmt.Printf("Горутина %d закончила работу\n", id)
<-sem // освобождение семафора
}(i)
}
wg.Wait()
}
В этом примере одновременно не более трёх горутин могут выполнять работу. Семафор полезен для ограничения параллелизма, например, при работе с ограниченными ресурсами (соединениями, файлами и т.д.).