Параллелизм Java 8 в AWS лямбда? - PullRequest
0 голосов
/ 01 июня 2019

У нас есть лямбда-функция AWS, которая должна выполнить несколько проверок, вызванных удаленными службами. Пока один из них возвращает ложь, лямбда может вернуться; в противном случае все проверки должны быть завершены, чтобы убедиться, что ни одна из них не вернула false. Прямо сейчас я использую параллельный поток для запуска задач, поскольку они могут идти независимо.

В ситуации, которая может быть не редкой, основной поток возвращается, когда одна из задач все еще выполняется со своим потоком, или поток заблокирован в ожидании ввода-вывода, поскольку при коротком замыкании возникла ложная ошибка с другой задачей , В документации по лямбде AWS говорится, что все потоки в лямбде будут заморожены при возврате основного потока. И они разморозятся, когда лямбда обработает следующий запрос. Будет ли занятый / заблокированный поток продолжать работать с исходной задачей после повторной активации, или он будет выполнять новую задачу для текущего запроса?

Был бы очень признателен, если бы Лямбда-гуру могли поделиться некоторыми идеями.

1 Ответ

0 голосов
/ 04 июня 2019

Надеюсь, я правильно понял. Вы хотите выполнять параллельные действия, ожидая их завершения.

Я только что прочитал в StackOverflow комментарий о следующем:

Потоки о параллелизме данных; Проблемы параллельных данных связаны с процессором, а не с IO. Похоже, что вы просто хотите одновременно выполнять несколько в основном не связанных с IO задач. Для этого используйте обычный старый пул потоков; Ваш первый пример - идеальный кандидат на ExecutorService.invokeAll ()

Может быть, ExecutorService может помочь.

Я не знаю, как структурирован ваш код, но я могу предложить что-то вроде этого:

int processors = Runtime.getRuntime().availableProcessors();
ExecutorService executorService = Executors.newFixedThreadPool(processors);

List<Callable<Boolean>> services = getURLToCheck().parallelStream()
       .map(this::checkService)
       .collect(Collectors.toList());

try {
    List<Future<Boolean>> futures = executorService.invokeAll(services);
    // do your validation with the concurrent tasks. 
} catch (InterruptedException e) {
    // Handle as you wish
}

Где также:

private List<URL> getURLToCheck() {
    // Fetch your URL from wherever :)
}

private Callable<Boolean> checkService(URL url){
    // Logic to check the service
}

Класс Future имеет ключевые методы, которые могут быть вам полезны. Метод isDone() и .get().

Первый указывает, завершено ли задание или нет, а второй будет ждать, пока оно завершит работу, сгенерировав все исключения, возникшие внутри, но обернутые в ExecutionException. Может быть, вы можете объединить эти методы, чтобы сделать проверку. Быстро подумав, я представил себе цикл while, в котором вы спрашиваете, закончилось ли будущее, и если да, то получите результат проверки, и с этим прервите этот цикл, если false. Но мне это не нравится, ха-ха.

Надеюсь, я все прояснил. И также я надеюсь, что это может помочь. Если нет, я старался изо всех сил.

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