Sobes.tech
Назад к вопросам
Senior
3

Приходилось ли использовать паттерны Fan-In и Semaphore в работе?

Компании, где спрашивали
sber tech

Ответ от нейросети

sobes.tech AI

Паттерн Fan-In в Go часто используется для объединения нескольких каналов в один, что позволяет эффективно собирать результаты от нескольких горутин. Это удобно, когда нужно агрегировать данные из разных источников.

Пример Fan-In:

func fanIn(channels ...<-chan int) <-chan int {
    out := make(chan int)
    var wg sync.WaitGroup
    wg.Add(len(channels))

    for _, ch := range channels {
        go func(c <-chan int) {
            defer wg.Done()
            for v := range c {
                out <- v
            }
        }(ch)
    }

    go func() {
        wg.Wait()
        close(out)
    }()

    return out
}

Паттерн Semaphore используется для ограничения количества одновременно выполняющихся горутин, чтобы контролировать нагрузку и ресурсы. В Go это реализуется через буферизированный канал, который выступает в роли семафора.

Пример Semaphore:

sem := make(chan struct{}, maxConcurrent)

for _, task := range tasks {
    sem <- struct{}{} // захват семафора
    go func(t Task) {
        defer func() { <-sem }() // освобождение семафора
        process(t)
    }(task)
}

Использовал оба паттерна для управления конкурентностью и синхронизации в высоконагруженных сервисах на Go.