Используется ли параллельная библиотека задач, PLINQ или параллельные коллекции в веб-приложениях, созданных с помощью ядра MVC Asp.Net или Razor Pages?
Короткий ответ: нет для PLINQ и многопоточности.
Во-первых, async / await обернуты вокруг класса Task
, который является частью TPL.
Во-вторых, считается плохой практикой параллелизм и запуск нескольких рабочих потоков в приложении ASP.NET (Core).
В ASP.NET Core вы используете TPL и _2 _ / _ 3_ для истинно асинхронных операций (сетевые вызовы, доступ к вводу-выводу (доступ к файлам), вызовы базы данных и т. Д.), Когда приложение должно ждать завершения внешнего аппаратного компонента.
Задачи, связанные с процессором (вычисления и т. Д., Выполняемые в одном или нескольких потоках), не ожидаются в приложениях ASP.NET Core и выполняются только в основном потоке (блокирующим образом).
ASP.NET (унаследованный) раньше имел собственный пул потоков для управления соединениями, а ASP.NET Core просто использует для него пул потоков по умолчанию. В устаревшем ASP.NET у вас все равно будет выполнение одного потока для каждого запроса, даже если вы используете PLINQ, запускайте несколько задач и ожидайте их. ASP.NET Core - нет.
Тем не менее, отвлекать свои собственные задачи и потоки - плохая идея. Это может ускорить вашу однопоточную операцию при небольшом количестве запросов (меньшая задержка), но может сделать ее безответственной в сценариях с большим количеством запросов из-за нехватки потоков и вашего приложения, тратящего много времени ЦП на управление потоками и переключение между потоками. Это также мешает эвристике потоков.
Также при нехватке потоков ваше приложение не будет принимать никаких новых запросов. По этой причине задачи, связанные с ЦП, должны выполняться синхронно. Выполнение работы с привязкой к ЦП только через Task.Run
ничего вам не даст. Вы освобождаете поток запроса, ожидая завершения задачи, но поскольку вы запускаете новую задачу, для ее обработки используется другой поток.
Это похоже на выполнение параллельной задачи. Когда вы запускаете много задач на запрос, есть одна точка, в которой у вас есть много задач в очереди и для многих запросов, и приложение перестает принимать запросы, и пользователь получает ужасные 50-кратные HTTP-ошибки для вашего приложения, не принимающего новые запросы, когда не запускается много параллельные задачи позволят вам взять гораздо большее количество подключений и поставить их в очередь, в то время как запросы других задач будут выполнены
Параллелизм и параллельные задачи важны для настольных приложений, и их ожидание имеет смысл (чтобы не блокировать поток пользовательского интерфейса), даже если это одно длительное выполнение. Кроме того, в настольном приложении вы можете быть уверены, что приложение используется только одним пользователем, поэтому использование как можно большего количества ядер ЦП для быстрой обработки задачи - это очень хорошо.
Это просто плохо переводится, когда вы применяете это к общему приложению, такому как приложение ASP.NET Core, с которым будет взаимодействовать неизвестное количество пользователей.
person
Tseng
schedule
28.10.2020
IAsyncResult
, но полагаю, что он используется для достижения асинхронности, а не для параллелизма / параллелизма. Другими словами, не для одновременного выполнения двух или более действий, а для того, чтобы не блокировать поток, выполняя одно действие за раз. - person Theodor Zoulias   schedule 28.10.2020