我们有一个 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/