【问题标题】:Java 8 concurrency in AWS lambda?AWS lambda 中的 Java 8 并发?
【发布时间】:2019-06-01 01:16:47
【问题描述】:

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

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

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

【问题讨论】:

    标签: java concurrency java-8 aws-lambda


    【解决方案1】:

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

    我刚刚在 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 循环,您会在其中询问未来是否完成,如果是,则获得验证结果,如果为假,则打破该循环。不过我不喜欢哈哈。

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

    【讨论】:

    • 您是否粘贴了此部分的链接 -> 如果 AWS Lambda 选择重用容器,则在函数结束时未完成的 Lambda 函数启动的后台进程或回调将恢复。您应该确保代码中的所有后台进程或回调(如果是 Node.js)在代码退出之前完成
    • 如果是这样,也许你可以杀死未来的进程! future.cancel(boolean)
    猜你喜欢
    • 2016-10-27
    • 1970-01-01
    • 2022-07-20
    • 2018-03-11
    • 2021-03-28
    • 1970-01-01
    • 2015-11-08
    • 2018-01-12
    • 2021-05-07
    相关资源
    最近更新 更多