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

Минимальный 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.

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

Вы узнаете:

  • как пул отдаёт результаты через канал ответов
  • когда пул избыточен против горутины на задачу
Задание · вопросы

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

Вопрос 1 из 3

Что задаёт число воркеров пула?

Вопрос 2 из 3

Что задаёт буфер канала задач?

Вопрос 3 из 3

Пул всегда лучше горутины-на-задачу?

Итоги

Пул — N воркеров, канал задач, range до закрытия. Число воркеров — верхняя граница задач в работе, буфер — допустимое отставание.

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