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 сохраняет порядок через индексы
Проверьте себя
Для CPU-bound задачи на 8 ядрах — сколько воркеров разумно?
Сохраняется ли порядок результатов fan-out?
Почему для I/O-задач воркеров может быть больше ядер?
правильных ответов
Fan-out — N воркеров на один канал; канал раздаёт задачи по одной; порядок результатов не гарантирован. Дальше — собрать результаты обратно: fan-in.
10 000 ₽ · 60 минут · онлайн