Это правильное понимание?
Цикл, который постоянно опрашивает что-то, пока не получится ответ, очень расточительный.Если вы добавляете sleep
между каждым опросом, вы уменьшаете использование ЦП, но за счет уменьшения скорости отклика на отдельные запросы ... по сравнению с тем, что достижимо, если вы делаете это правильный способ.
Не зная точно, что вы делаете (что опрашиваете и почему), немного сложно сказать, что такое решение best .Но вот несколько возможных сценариев:
Если ваш веб-сервис ожидает ответа от внешнего сервиса, то простое решение - просто выполнить чтение блокировки и настроитьвеб-сервер с большим количеством рабочих потоков.
С другой стороны, если ваша веб-служба ожидает завершения вычислений, создайте новый поток и дождитесь / сообщите ... или один изклассы синхронизации более высокого уровня ... может быть ответом.
Если вам нужно параллельно обрабатывать очень большое количество запросов на блокировку, для этого потребуется много потоков иотсюда много памяти и прочего.В этом случае вам нужно рассмотреть веб-контейнер, который нарушает ограничение «один поток на запрос».Последняя версия спецификации Servlet позволяет это делать, как и некоторые альтернативные (не Servlet) архитектуры.
СЛЕДУЙТЕ ЗА
... Я думаю, проблема в том, что вы говорите 2, что сервис просто ожидает вычислений.Таким образом, простое выполнение этих вычислений высвободит ресурсы в сервисе?
Если то, что вы описываете, верно, то выполнение вычисления в другом потоке не заставит его идти намного быстрее.Фактически, это может замедлить работу.
Конечным узким местом будет емкость процессора, пропускная способность диска и / или пропускная способность сети.Многопоточность только ускорит выполнение отдельного запроса, если вы сможете эффективно / рационально использовать 2 или более процессоров по одному и тому же запросу одновременно.Это только улучшит вашу пропускную способность в той степени, в которой оно позволяет выполнять запросы, пока другие ожидают внешних событий;например, сетевые ответы для получения или файловые операции чтения / записи для завершения.
Я думаю, что вам действительно нужно сделать, это выяснить, почему вычисления занимают так много времени, и попытаться исправить это:
- Ваши запросы к базе данных неэффективны?
- Получаются ли слишком большие наборы результатов?
- У вас есть проблемы с вашими схемами?
- Плохой выбор индексов?
- Или вы просто пытаетесь сделать слишком много на машине, которая слишком мала, используя неправильную базу данных?
Существуют различные методы измерения производительность службы приложений и базы данных для определения узких мест.(Начните с поиска Google ....)