Можете объяснить, как функционирует пулл потоков при обработке асинхронных запросов?

  • 7 августа 2023 г. 9:31
Ответы на вопрос 7
Пулл потоков — это распространенная модель многопоточности, используемая для эффективного использования системных ресурсов при работе с асинхронными запросами. Это некое хранилище "готовых к использованию" потоков, которые можно многократно использовать для выполнения различных задач.

Вот основная идея работы пула потоков:

1. Когда приходит новый асинхронный запрос, он помещается в очередь на обработку.

2. Пулл потоков следит за этой очередью и, как только появляется новая задача, он назначает ее одному из свободных потоков. Если все потоки в данный момент заняты, запрос остается в очереди, пока поток не освободится.

3. Поток из пула начинает обработку запроса и, когда она завершена, возвращается назад в пул и становится доступен для обработки других запросов.

4. Если все потоки заняты и в очереди накапливается много задач, пул потоков может автоматически увеличиться (если его того требует конфигурация), создав дополнительные потоки для обработки возросшей нагрузки.

Основное преимущество использования пулла потоков вместо создания новых потоков для каждого запроса — высокая производительность и более эффективное использование ресурсов. Создание нового потока — достаточно затратная по ресурсам операция, и использование запаса "готовых к бою" потоков помогает сэкономить их. После завершения задачи потоки не уничтожаются, а возвращаются в пул для последующего повторного использования.
Ждать окончания других запросов 
 Если метод логин обращается к базе данных на другом хосте и у этого хоста возникли проблемы, то надо будет ждать определенное время, независимо от состояния пула. 
 Если речь идет о простом логине с использованием редиса, то пользователь не почувствует разницу, будь то 5 тысяч или 15 запросов. 
 Пул потоков виртуальной машины (CLR, JVM и т. д.) или JIT представляет собой виртуализацию над пулом потоков операционной системы. ОС распределяет задачи с помощью своего планировщика на реальные потоки процессора. Даже в случае двухядерного ЦП с гипертредингом это означает 4 потока. Таким образом, независимо от нашего восприятия, ожидание и очереди есть всегда и везде. 
 В случае с контроллером запросов, всё зависит от фреймворка и его конфигураций. Можно сразу отклонить запрос, отклонить его по таймауту или обернуть виртуальным потоком. У JVM был проект Loom, который позволял создавать до миллиона потоков без ограничений ОС (начиная с JDK версии 12).
Ждите окончания других запросов. Понимайте, что использование пула потоков влечет за собой очередь и ожидание. Если метод логина обращается к базе данных на другом хосте, который в данный момент испытывает проблемы, в любом случае придется ждать определенное время, независимо от состояния пула потоков. Если это обычный логин с условным использованием Redis, пользователь не ощутит разницу, будь там 5 тысяч запросов или пятнадцать. Пул потоков виртуальной машины (CLR, JVM и т. д.) или JIT - это абстракция над пулом потоков операционной системы. Операционная система, в свою очередь, распределяет задачи с помощью своего планировщика на реальные потоки оборудования. В случае, если используется двухядерный процессор с гипертредингом, будет доступно 4 потока. То есть, независимо от того, осознаем ли мы это или нет, очереди и ожидания существуют всегда и везде. Что касается контроллера запросов, здесь все зависит от выбранного фреймворка и его настроек. Можно сразу отклонить запрос, отклонить по истечении времени ожидания или завернуть в виртуальный поток. В JVM существует такой проект, как Loom, который позволяет создавать миллион потоков без ограничений операционной системы (включен в JDK начиная с версии 12).
Похожие вопросы