Что такое fan-out fan-in паттерн?

Middle+
679 просмотров
AFK Offer AI

Fan-out fan-in — паттерн конкурентной обработки данных. Fan-out: одна задача раздаётся на несколько горутин для параллельной обработки. Fan-in: результаты собираются обратно в один канал.

func fanOut(input <-chan int, workers int) []<-chan int {
    channels := make([]<-chan int, workers)
    for i := 0; i < workers; i++ {
        channels[i] = process(input)
    }
    return channels
}

func fanIn(channels ...<-chan int) <-chan int { out := make(chan int) var wg sync.WaitGroup for _, ch := range channels { wg.Add(1) go func(c <-chan int) { defer wg.Done() for v := range c { out <- v } }(ch) } go func() { wg.Wait(); close(out) }() return out }

Типичный пример: парсинг URL-ов. Один продюсер генерирует URL-ы, 10 воркеров скачивают параллельно (fan-out), результаты сливаются в один канал для записи в БД (fan-in). Это основа pipeline-архитектуры в Go.

Следующий вопрос

Способы синхронизации данных?