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.