Материал проходит вычитку — возможны неточности.
Урок 111 из 118

Fan-out

Клиент «ФинГуру» прислал пакет на тысячу файлов, и Миша распилил загрузку на куски по шардам. Каждый кусок ушёл своему воркеру через общий канал, обработка пошла параллельно.

Главная мысль

fan-out — раздать работу из одного канала нескольким воркерам; значение из канала достаётся ровно одному, и именно это распределяет нагрузку.

Один канал, много воркеров

tasks := make(chan *FileMeta)

for i := 0; i < 4; i++ {
    go func() {
        for f := range tasks {
            process(f)
        }
    }()
}

// производитель: tasks <- f...

Четыре воркера читают один канал. Значение, отправленное в канал, достанется ровно одному из них — канал сам «раздаёт» задачи. Это и есть fan-out: один источник, несколько потребителей, параллельная обработка.

Почему это просто

Никакой координации между воркерами не нужно: они не знают друг о друге. Вся логика распределения — в канале. Воркер читает, обрабатывает, читает следующее. Закрытие канала — общий сигнал «работы больше нет» для всех четырёх сразу.

Порядок не сохраняется

Результаты воркеров приходят в произвольном порядке: кто обработал, тот и ответил. Если порядок важен, каждый воркер должен нести с собой индекс задачи — либо результаты пишутся в слайс по индексу, как в уроках про WaitGroup. Fan-out — про параллелизм, а не про упорядоченность.

В следующем уроке

Вы узнаете:

  • как подбирать число воркеров под CPU/IO-профиль
  • как fan-out сохраняет порядок через индексы
Задание · вопросы

Проверьте себя

Вопрос 1 из 3

Для CPU-bound задачи на 8 ядрах — сколько воркеров разумно?

Вопрос 2 из 3

Сохраняется ли порядок результатов fan-out?

Вопрос 3 из 3

Почему для I/O-задач воркеров может быть больше ядер?

Итоги

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

Наш сайт собирает куки. Чтобы тебе было удобнее им пользоваться. Нажимая на кнопку, ты даёшь разрешение собирать куки