Все темы
Тема 03

Паттерны конкурентности

Разберись в теме, затем проверь понимание на задачах.

0/4 решено0%
К задачам

О чём этот блок

Загрузчик логов, обработчик очереди сообщений, ETL-конвейер, агрегатор метрик устроены одинаково: данные проходят через несколько стадий, некоторые стадии распараллелены, в конце результаты собираются вместе. Блок учит собирать такие конструкции из каналов и горутин: где распараллелить, где слить потоки обратно, как ограничить число одновременных воркеров и как сгруппировать мелкие операции в пачки.

Сквозная тема — кто закрывает каналы. Закрывает тот, кто точно знает, что отправок больше не будет: единственный отправитель или координатор, дождавшийся всех отправителей. Тогда закрытие проходит вниз по конвейеру и по очереди завершает все стадии.

Что понадобится

  • Fan-in: слияние N каналов в один и закрытие выхода после wg.Wait().
  • Ограниченный пул воркеров и сбор ошибок без гонок.
  • Многостадийный конвейер, где у каждой стадии свой пул.
  • Батчинг по двум условиям: набралось N элементов или вышло время.
  • select с <-ctx.Done() рядом с каждой отправкой, если потребитель может уйти раньше.

Задачи

Что прочитать

// Идиома блока: fan-in закрывает выход ровно после всех источников.
var wg sync.WaitGroup
for _, c := range channels {
    wg.Add(1)
    go func(c <-chan int) {
        defer wg.Done()
        for v := range c {
            out <- v
        }
    }(c)
}
go func() { wg.Wait(); close(out) }()

Задачи темы 4