Является ли реактивное программирование более эффективным с точки зрения использования памяти при управлении потоками длJAVA

Программисты JAVA общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 Является ли реактивное программирование более эффективным с точки зрения использования памяти при управлении потоками дл

Сообщение Anonymous »

Я часто использую Awaitility в своих тестах для обработки асинхронных операций. Однако каждый вызов Awaitility порождает потоки, что приводит к высокому потреблению памяти при выполнении больших тестов. Я ищу альтернативное решение, которое обеспечивает аналогичную функциональность, но более эффективно использует память.

Пример сценария:
Ниже приведен упрощенный пример, в котором мне нужно найти 500 случайных простых чисел от 0 до 10 000 000.
Использование ожидания:

Код: Выделить всё

static void waitWithAwaitility() {
AtomicInteger primeCount = new AtomicInteger(0);
await()
.atMost(1, TimeUnit.HOURS)
.pollInterval(3, TimeUnit.SECONDS)
.until(() -> {
int number = supplierMethod().get();
if (isPrime(number)) {
System.out.println("Found prime: " + number);
primeCount.incrementAndGet();
}
return primeCount.get() >= 500;
});
}
Вспомогательные методы:

Код: Выделить всё

public static Supplier supplierMethod() {
int number = new Random().nextInt(10_000_000) + 1;
System.out.println("Generated number: " + number);
return () -> number;
}

public static boolean isPrime(int number) {
if (number  repeat.delayElements(pollInterval))
.takeUntil(condition::test)
.last()
.timeout(timeout, Mono.error(new RuntimeException("Timeout exceeded")))
.onErrorResume(throwable -> {
System.err.println(throwable.getMessage());
return Mono.empty();
})
.subscribeOn(Schedulers.boundedElastic());
}

static void waitWithJavaRx() {
AtomicInteger primeCount = new AtomicInteger(0);

Mono result = new DifferentAwaitility().reactiveAwait(
() -> supplierMethod().get(),
number -> {
boolean primeStatus = isPrime(number);
System.out.println("Is prime? " + primeStatus);
if (primeStatus) {
primeCount.incrementAndGet();
}
return primeCount.get() >= 500;
},
Duration.ofSeconds(3),
Duration.ofHours(1)
);

Integer finalResult = result.block();
if (finalResult != null) {
System.out.println("Result: " + finalResult);
} else {
System.err.println("Error: Timeout or other failure occurred");
}
}
Проблема с реактивным подходом:

Хотя этот подход работает, потребление памяти составило три раз выше, чем при использовании Awaitility. Ниже приведены снимки экрана VisualVM, сравнивающие использование памяти:
Изображение
< /p>
  • Использование памяти ожидания
  • Использование памяти реактивного программирования
Вопрос:

Есть ли лучший подход к достижению той же функциональности, что и Awaitility, но с меньшим потреблением памяти? Я изучал реактивное программирование, но это не помогло сократить использование памяти. Будем очень признательны за любые предложения или оптимизации!

Подробнее здесь: https://stackoverflow.com/questions/792 ... asynchrono
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «JAVA»