AWS lambda 中的 Java 8 并发?

标签 java concurrency java-8 aws-lambda

我们有一个 AWS lambda 函数,需要通过调用远程服务来执行一些检查。只要其中一个返回 false,lambda 就可以返回;否则,需要完成所有检查以确保没有返回 false。现在我正在使用并行流来运行任务,因为它们可以独立运行。

在一种可能并不罕见的情况下,主线程返回,而其中一个任务仍在与其线程一起运行,或者线程被阻塞等待 I/O,因为短路发现另一个任务出现错误。 AWS lambda 文档表示,当主线程返回时,Lambda 中的所有线程都将被卡住。一旦 lambda 处理下一个请求,它们就会解冻。繁忙/阻塞的线程在重新激活后会继续处理原始任务,还是会为当前请求承担新任务?

如果 Lambda 专家能够分享一些见解,我将不胜感激。

最佳答案

我希望我理解正确。您希望在等待并行 Activity 完成的同时执行这些 Activity 。

我刚刚在 StackOverflow 上读到一条评论,内容如下:

Streams is about data-parallelism; data parallel problems are CPU-bound, not IO-bound. It seems that you're simply looking to run a number of mostly unrelated IO-intensive tasks concurrently. Use a plain-old thread pool for that; your first example is an ideal candidate for 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 循环,您询问 future 是否完成,如果完成,则获得验证结果,如果为 false,则中断该循环。不过我不喜欢哈哈。

希望我已经表达清楚了。我也希望这能有所帮助。如果没有,我已经尽力了。

关于AWS lambda 中的 Java 8 并发?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56403197/

相关文章:

java - 仅当存在多个项目时才向 Collectors.joining() 添加前缀和后缀

java - 未经检查将 java.io.Serializable 转换为 java.util.ArrayList

Java 时间(20 月 29 日星期三 :56:47 +0000 2012) to epoch

java - Oracle JDK8:展开循环由JVM转换为NOOP吗?

java - 如何从队列中分块取出项目?

java - 执行服务 shutdownNow ,它是如何工作的

java-8 - java 8 中的限制和获取平面列表

java - 如何从 bash 向 java 程序发送命令?

java - 自定义类队列数据结构的并发帮助

java - 将列表流拆分为 map 是否需要自定义收集器?