Настройка размера пула потоков в сервисе - PullRequest
1 голос
/ 22 сентября 2019

Я пишу сервис, который берет два URL urlA и urlB, чтобы получить два целых числа a и b.Служба возвращает sum из a и b.

. В своей самой простой форме служба работает так:

public Integer getSumFromUrls(String urlA, String urlB) {

    Integer a = fetchFromUrl(urlA);
    Integer b = fetchFromUrl(urlB);

    return a + b;
}

Здесь fetchFromUrl - синхронная операция, таким образом, он блокирует поток обработки, если значение не доступно.Чтобы сделать вещи эффективнее, я бы предпочел использовать ExecutorService, чтобы запланировать две выборки и вернуться, когда будут доступны результаты.Вот измененный код (игнорируйте синтаксические нюансы)

public Integer getSumFromUrls(String urlA, String urlB) {
    Future<Integer> aFuture = Executors.newSingleThreadScheduledExecutor().submit(new Callable<Integer>() {
        public Integer call() {
            return fetchFromUrl(urlA);
        }

    });
    Future<Integer> bFuture = Executors.newSingleThreadScheduledExecutor().submit(new Callable<Integer>() {
        public Integer call() {
            return fetchFromUrl(urlB);
        }                                                                                
    });

    Integer a = aFuture.get();
    Integer b = bFuture.get();

    return a + b;
}

Здесь я создал однопотоковых исполнителей для одновременного выполнения запросов.

Поскольку этот код будет выполняться в контексте веб-службы, я, вероятно, не должен создавать однопоточных исполнителей локально внутри функции, а должен использовать пулы потоков N-размера, совместно используемые взапросы.

Мои вопросы здесь:

  1. Правильно ли вышеприведенное понимание (выделенная курсивом часть)?
  2. Если да, как мне выбрать оптимальныйразмер пула потоков.Должно ли это быть функцией размера пула потоков моего сервисного контейнера или пропускной способности запроса или того и другого и т. Д.?
  3. Существует ли лучший способ оптимизации этого сценария, чтобы потоки службы не блокировались при выполнении операций ввода-вывода в большинстве случаев.время.

Примечание: детали, представленные в этом вопросе, не являются полностью реальными сценариями, но представляют тот же набор сложностей, необходимых для ответа на вопрос.

1 Ответ

0 голосов
/ 22 сентября 2019

Если ваша функция getSumFromUrls выполняется каждый раз, когда приходит новый запрос, это означает, что она будет каждый раз создавать новый ThreadPool и отправлять задачу.Предположим, что если у вас есть запрос 1000 в любой момент времени, то будет создан 1000 ThreadPool, который в конечном итоге создаст 1000s потока.Я считаю, что если вы создадите 1000 или более потоков в любой момент времени, это будет проблемой для вашего приложения.Как правило, в любой момент времени номер активного потока должен быть примерно равен или равен количеству available core размера системы, однако это полностью зависит от вариантов использования. Предположим, ваша задача равна CPU intensive, тогда число потоков должно быть какРазмер ядра ЦП, но если ваша задача IO intensive, то вы можете иметь большее количество потоков.Большее количество потоков означает, что произойдет больше переключений контекста, что будет иметь свою стоимость и может снизить производительность приложения.

Правильно ли приведенное выше понимание (выделенная курсивом часть)?

-> Да.

Если да, как мне выбрать оптимальный размерпул потоков.Должно ли это быть функцией размера пула потоков моего сервисного контейнера или пропускной способности запроса или того и другого и т. Д.?

-> Как я уже упоминал выше, это зависит от того, какую задачу вы выполняете.Для выполнения этой задачи следует использовать общий пул потоков.

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

-> Вы должны сравнить размер пула потоков, и операционная система автоматически назначит ЦП другому потоку, когда поток выполняет операции ввода-вывода и не требует ЦП.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...