Назад к вопросам
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.