首页 > 解决方案 > AWS lambda 中的 Java 8 并发?

问题描述

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

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

如果 Lambda 大师可以分享一些见解,我将不胜感激。

标签: javaconcurrencyjava-8aws-lambda

解决方案


我希望我理解正确。您希望在等待它们完成的同时执行并行活动。

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

Streams 是关于数据并行的;数据并行问题受 CPU 限制,而不是 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 循环,您会在其中询问未来是否完成,如果是,则获得验证结果,如果为假,则打破该循环。但是我不喜欢哈哈。

希望我说清楚了。我也希望能有所帮助。如果没有,我尽力了。


推荐阅读