java - AWS lambda 中的 Java 8 并发?
问题描述
我们有一个 AWS lambda 函数,它需要通过调用远程服务来执行一些检查。只要其中一个返回false,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 循环,您会在其中询问未来是否完成,如果是,则获得验证结果,如果为假,则打破该循环。但是我不喜欢哈哈。
希望我说清楚了。我也希望能有所帮助。如果没有,我尽力了。
推荐阅读
- r - 底部需要情节彩条
- node.js - 如何承诺一个基于原型的类库?
- javascript - jQuery 撤消多个 remove();
- android - 从 PHONE_STATE 意图操作中读取数字 android 9 不工作
- c# - 一段时间后的C# Socket编程混合数据
- drupal - 最佳实践 Drupal 7
- intellij-idea - gitlab intellij 插件收到 HTTP 代码 400
- numpy - 对 numpy 的转置感到困惑
- php - 响应式文件管理器 | 上传文件夹没有。检查您的 config.php 文件
- output - 在不使用 while/If 循环的情况下打印 1 到 N 个数字