Я использую аннотацию @Async Spring Boot и CompletableFuture, примерно так:
Код: Выделить всё
long start = System.nanoTime();
List list = new ArrayList();
List allFutures = new ArrayList();
for (int i = 0; i < 1000; i++) {
allFutures.add(httpClient.getStringAsync("Hello"));
}
List unwrappedFutures = allFutures.stream()
.map(CompletableFuture::join)
.flatMap(List::stream)
.collect(Collectors.toList());
list.addAll(unwrappedFutures);
long duration = (System.nanoTime() - start) / 1_000_000;
log.info("Done in {} msecs", duration);
Это занимает столько же количество времени для обработки либо на моем ноутбуке, который, как показывает «Runtime.getRuntime().availableProcessors()», имеет 12 ядер, либо в кластере EKS, где количество ядер сейчас кажется одним.
Я думаю, мне нужно настроить ThreadPoolTaskExecutor так, чтобы чем больше ядер было доступно, тем меньше времени требовалось для обработки.
Однако я не совсем уверен, как это можно определить ядро, максимальный размер пула и емкость очереди.
Интересно, должен ли размер пула быть равен количеству элементов в списке? То есть, если в списке 1000 элементов, а это значит, что нам нужно сделать 1000 вызовов удаленного сервиса, нужно ли нам 1000 потоков? Кажется, это много.
Подробнее здесь: https://stackoverflow.com/questions/718 ... -pool-size
Мобильная версия