IHttpHandler: ускорение производительности с помощью параллелизма?

#c# #asp.net #multithreading

#c# #asp.net #многопоточность

Вопрос:

У меня есть IHttpHandler, который выполняет три метода:

  • a = Method_A
  • b = method_B
  • c = Method_C(a,b)

Вычисления метода A и метода B полностью независимы. Метод C использует результаты методов A и B. В настоящее время методы выполняются последовательно. Чтобы повысить общую производительность IHttpHandler, моя идея состоит в том, чтобы вычислять методы A и B параллельно. Метод C следует запускать, если A и B завершили работу. Возможно ли это и как?

С уважением, Торстен

Ответ №1:

Конечно, это возможно; но самое интересное — выяснить, разумно ли это. Если работа привязана к процессору, то при небольшом количестве запросов она будет масштабироваться (например, это будет хорошо выглядеть на локальном компьютере только с вами) — однако, если есть много других параллельных запросов, то вы действительно можете снизить производительность (многопоточность имеет накладные расходы, и у вас естьконечные ядра).

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

Просто запустите задачу для одного из элементов:

 var task = new Task<ResultType>(() => Method_B());
task.Start();
var a = Method_A();
var b = task.Resu<
Method_C(a, b);
  

Обратите внимание, что это приводит к ряду связанных проблем — например, код в Method_B() не будет иметь прямого доступа к какому-либо контексту, связанному с запросом. В идеале Method_B() сначала соберите всю необходимую информацию (в основном потоке http-запроса) и передайте ее через простой тип данных, не связанный с http-контекстом. Аналогично, все, что использует локальные данные потока ( TransactionScope например), не будет автоматически поступать в Method_B() .

Ответ №2:

Вам нужно использовать TPL (библиотека параллельных задач). Проверьте по этой ссылке.

Ответ №3:

Это возможно и тривиально — либо с асинхронными расширениями, либо просто с постановкой в очередь рабочих элементов и использованием сигналов для синхронизации возврата. быть доступным.

Главный вопрос в том, имеет ли это смысл. Это имеет смысл только тогда, когда сервер все равно не занят вычислениями. Потому что, если это так — вы не можете волшебным образом создавать новые ядра процессора.