Я запускаю консольное приложение C#, которое многопоточно. Основной процесс извлекает некоторые данные для работы, разбивает его на настраиваемое количество меньших наборов данных, а затем генерирует одинаковое количество потоков для обработки каждого подмножества данных.Многопоточные вызовы и соперничество WebRequest
Для обработки отдельной записи поток должен выполнить вызов веб-службы с использованием класса WebRequest и метода POST. Запрос отправляется с помощью GetRequestStream(), и ответ извлекается с помощью GetResponse().
В псевдокоде, процедура выглядит следующим образом:
prepare WebRequest data;
* get time (start-of-Processing);
Stream str = request.GetRequestStream();
Write data to stream;
stream.Close();
WebResponse resp = request.GetResponse();
* get time (response-received);
process response;
finally close response stream;
Timing данные свидетельствуют о том, что, когда мы разделили наши данные на более чем 4 потоков, наша пропускная способность для процесса в целом не улучшается, и в некоторых случаях даже падает. Данные синхронизации с веб-службы поддерживают их работу, но остаются неизменными.
- На 4 нитей, наши очевидно накладные для передачи данных и извлечения потока ответа средних вокруг секунды.
- Когда мы запускаем более 4 потоков, среднее значение увеличивается с максимальными значениями , которые встречаются в десятки секунд!
Сегодня я смог запустить два отдельных процесса, каждый из которых запускает 4 потока (но по существу гарантирует, что каждый поток по-прежнему работает с уникальными данными). На этот раз мы почти удвоили нашу общую пропускную способность, и каждый процесс имел стабильные сроки около секунды.
Это заставляет меня полагать, что мы сталкиваемся с каким-то ограничением ресурсов по отношению к классу WebRequest; но это ограничение для каждого процесса, а не ограничение машины. Я знаю, что мы могли бы сделать наши вызовы асинхронно с BeginGetRequestStream и BeginGetResponse, но я скептически отношусь к тому, что это окажет положительное влияние, если мы на самом деле нажмем какой-то ресурс?
На что я могу обратить внимание, чтобы мы могли увеличить количество разделов в рамках одного процесса без снижения производительности?
Спасибо за детали. –