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

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

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

// Fan-out: 3 воркера читают из jobs
jobs := make(chan int, 100)
results := make(chan int, 100)

for w := 0; w < 3; w++ { go func() { for job := range jobs { results <- process(job) // fan-in в results } }() }

// Отправляем задачи for i := 0; i < 50; i++ { jobs <- i } close(jobs)

Fan-in — слияние нескольких каналов:

func merge(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
}

Паттерн используется в пайплайнах обработки данных, когда один этап медленнее остальных.

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

Захват переменной в Go?