[英]Java 8 concurrency in AWS lambda?
我们有一个AWS lambda函数,需要通过调用远程服务来执行一些检查。 只要其中一个返回假,lambda就可以返回; 否则,所有检查都需要完成,以确保没有返回false。 现在我使用并行流来运行任务,因为它们可以独立运行。
在可能并非罕见的情况下,主线程返回,而其中一个任务仍在运行其线程,或线程被阻塞等待I / O,因为短路已经看到另一个任务的错误。 AWS lambda文档说,当主线程返回时,Lambda中的所有线程都将被冻结。 一旦lambda正在处理下一个请求,他们就会解冻。 繁忙/被阻止的线程在重新激活后是否继续处理原始任务,或者它将承担当前请求的新任务?
如果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循环,你问是否未来完成,如果是这样,有验证结果,如果是假的话,打破那个循环。 但我不喜欢哈哈。
希望我清楚自己。 我也希望能有所帮助。 如果没有,我尽我所能。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.