Расскажи подробнее про семафоры.
Ответ от нейросети
sobes.tech AI
Семафоры — это примитивы синхронизации, которые используются для управления доступом к общим ресурсам в многопоточных или конкурентных средах. В Go семафоры не встроены напрямую в стандартную библиотеку, но их можно реализовать с помощью каналов (channels).
Основная идея семафора — ограничить количество одновременно выполняющихся операций или потоков, которые могут получить доступ к ресурсу. Например, если у вас есть пул из 3 соединений к базе, семафор с максимальным счетчиком 3 позволит одновременно работать не более чем с тремя соединениями.
Пример реализации семафора на Go с использованием каналов:
package main
import (
"fmt"
"sync"
"time"
)
func main() {
// Создаем семафор с емкостью 3
sem := make(chan struct{}, 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()
}
В этом примере одновременно будут выполняться не более 3 горутин, остальные будут ждать освобождения семафора.
Таким образом, семафоры полезны для ограничения параллелизма и предотвращения гонок при доступе к ограниченным ресурсам.