繁体   English   中英

AWS lambda中的Java 8并发?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM