Sobes.tech
Back to questions
Senior
5

Расскажи подробнее про семафоры.

Companies where asked
AvitoAvito

Answer from AI

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 горутин, остальные будут ждать освобождения семафора.

Таким образом, семафоры полезны для ограничения параллелизма и предотвращения гонок при доступе к ограниченным ресурсам.