Минимальный worker pool
Клиентов прибавилось, и пачка в тысячу файлов порождала тысячу горутин. Миша ограничил одновременные загрузки пулом с фиксированным числом воркеров: тысяча горутин превратилась ровно в три.
worker pool — фиксированное число горутин, читающих общий канал задач: закрытие канала служит им общим сигналом остановки.
Минимальный пул
tasks := make(chan *FileMeta)
var wg sync.WaitGroup
for i := 0; i < 3; i++ {
wg.Add(1)
go func() {
defer wg.Done()
for f := range tasks {
process(f)
}
}()
}
for _, f := range files { // пачка из 100 файлов
tasks <- f
}
close(tasks) // сигнал стопа для всех воркеров
wg.Wait()
Три воркера читают канал; range выводит их из цикла, когда канал закрыт и опустошён. Это и есть минимальный пул: фиксированное число горутин, очередь задач, правило остановки. Fan-out из отвечает на «как раздать работу», пул добавляет «как ограничить число обработчиков и остановить их».
Что даёт фиксированное число
Число воркеров ограничивает число одновременно обрабатываемых задач сверху: занятый воркер не читает следующую задачу, так что в работе никогда не больше N задач. Реальный параллелизм определяют ядра и блокировки (,): три воркера на двух ядрах реально считают вдвоём, а воркер, ждущий сеть, процессор не занимает вовсе. Буфер tasks определяет, насколько производитель может оторваться вперёд: небуферизованный канал даёт обратное давление — отправка блокируется, пока воркер не освободится; буфер на K задач позволяет уйти вперёд на K, сглаживая неровности.
Пул против голых горутин
Голый fan-out (go process(f) на каждый файл) не ограничивает параллелизм: тысяча файлов — тысяча горутин. Пул держит число горутин фиксированным — это лимит на ресурс, который горутины расходуют (CPU, соединения, диск). Отсюда и связь с: пул — один из способов ограничить блокирующий I/O.
Вы узнаете:
- как пул отдаёт результаты через канал ответов
- когда пул избыточен против горутины на задачу
Проверьте себя
Что задаёт число воркеров пула?
Что задаёт буфер канала задач?
Пул всегда лучше горутины-на-задачу?
правильных ответов
Пул — N воркеров, канал задач, range до закрытия. Число воркеров — верхняя граница задач в работе, буфер — допустимое отставание.
10 000 ₽ · 60 минут · онлайн