gpt4 book ai didi

asynchronous - 当我在 lambda 函数中启动一个新线程并返回时会发生什么

转载 作者:行者123 更新时间:2023-12-04 05:17:43 25 4
gpt4 key购买 nike

当我在 lambda 函数中启动一个新线程并返回时,它看起来像是停止执行新线程并关闭。

public class Importer implements RequestHandler<Request<ImportJob>, Response> {

@Override
public Response handleRequest(final Request<ImportJob> request, final Context context) {

CompletableFuture.runAsync(() -> uploadOriginalFile(importJob), ioThreadPool)
.thenRunAsync(() -> convert(importJob), importThreadPool)
.thenRun(() -> createThumbnail(importJob))
.handleAsync((r, cause) -> completeJob(importJob, cause), ioThreadPool);

return new Response("Execution started");
}
}

当我使用 join() 等待所有 CompletableFuture 的执行时,它按我的预期运行,但是当我尝试在 aysnc 中运行它时,立即返回响应并终止。
有没有其他方法可以异步运行 lambda 或者我做错了什么?

最佳答案

Is there any other way to run lambda in async or I am doing something wrong?



可以使用同步“请求/响应”模型或异步“事件”模型调用 Lambda 函数。这两种调用类型最终与 Lambda 函数内部代码的工作方式无关。
  • RequestResponse (同步)- Lambda API 调用在函数返回响应或错误或调用运行超过允许时间之前不会返回;必须通过再次调用您自己来重试失败。
  • Event (异步)- Lambda API 调用立即返回,函数运行完成,并丢弃其输出;失败重试两次。

  • 似乎您正在使用请求/响应调用该函数,但在返回响应后尝试继续工作,这忽略了 Lambda 服务设计的一个内在部分。每次调用都会运行直到完成,并且 然后 它返回一个响应。当异步调用时,响应将被丢弃,但该响应是执行结束的信号,即函数在其任务上要么成功要么失败。 Lambda 停止计费计时器并在此时卡住或销毁容器。同步响应不能早于执行结束返回。

    Lambda 在每个容器中仅运行一个并发调用,因此您不需要多个线程,除非单个调用正在执行需要自己线程的不止一件事情。

    如果您需要 Lambda 函数的输出和更多处理在后台继续,那么您需要 function1 调用请求/响应,并且 function1 需要调用 Lambda 服务 API 并异步调用 function2。

    在这种情况下,您似乎实际上并不需要输出,因此您可以 invoke this function asynchronously from API Gateway by adding the X-Amz-Invocation-Type:Event header to the integration request -- 但是你的函数需要“阻塞”直到它完成——也就是说,它在完成处理之前不应该返回响应(记住,响应将被丢弃)。这可能看起来违反直觉,直到您记住每个并行调用都在其自己的容器中运行。

    关于asynchronous - 当我在 lambda 函数中启动一个新线程并返回时会发生什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49977016/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com