Если бы ASP.NET Core был одно-поточен

169
22 марта 2022, 07:20

Многопоточность

Согласно моему познанию ASP.NET Core и если сильно не углубляться в детали, то на сегодняшний день обработка HTTP-запросов на одноядерном процессоре происходит следующим образом:

  1. Приложению прилетел запрос (назовем его R1) и его нужно обработать.
  2. Из ThreadPool береться Поток Исполнения (T1) и ему передается этот запрос R1 для дальнейшей обработки. Если в ThreadPool не было (случай когда это первый запрос, который обрабатывает приложение со времени запуска или все потоки заняты) свободного потока, то он создается.
  3. Обработка R1 еще не закончилась, но приложению прилетел другой запрос (R2).
  4. Из ThreadPool берётся другой поток T2 и уже обработкой R2-запроса займётся T2.
  5. Так как процессор всего один и ядро у него только одно, то на физическом уровне обработка этих двух запросов будет происходить конкурентно — процессор попеременно (каждые ~30 мл) будет выделять свое время каждому из потоков для того чтобы те имели возможность обработать свой запрос.

Однопоточность

А теперь представим, что приложение ASP.NET Core имеет только один поток T1.

  1. Приложению прилетел запрос R1 и T1 принялся к его обработке.
  2. Обработка R1 еще не закончилась, но приложению прилетает второй запрос R2.
  3. И теперь потоку T1 необходимо обработать R2 тоже. И для этого организуется конкурентность, то есть, наш единственный поток попеременно будет переключаться с одного запроса на другой.

Вопрос

Я в начале отметил "... и если сильно не углубляться в детали" и возможно какие-то детали я не знаю и хотел бы узнать. А пока, я не понимаю, разве предложенная вторая однопоточная модель не имеет место быть? Зачем нужны эти вторичные потоки, ведь процессор так и так только один? Почему он не может с одним потоком "прыгать" с запроса на запрос и попеременно обрабатывать их?

READ ALSO
Обобщённое приведение IQueryable к IOrderedQueryable

Обобщённое приведение IQueryable к IOrderedQueryable

У меня есть generic метод преобразующий IQueryable<T> и возвращающий IOrderedQuerable<T> при помощи Linq-to-Entities

70
Как добавить ReactJS к проекту AspNet?

Как добавить ReactJS к проекту AspNet?

Пытаюсь как тут добавить ReactJS к проекту, но при добавлении этой строки:

107
Как ставить Awake&#39;и в очередь

Как ставить Awake'и в очередь

У меня есть несколько скриптов, в одном выполняется в Awake парсинг xml, и значения заносятся в Dictionary, а в других выполняется получение значения...

117