当前位置: 首页 > 知识库问答 >
问题:

从python中异步调用AWS lambda获取响应结果

阎星河
2023-03-14

我有一个AWS lambda函数,我可以用下面的代码同步调用并返回结果

response = lambda_client.invoke(
        FunctionName=FUNCTION_NAME,
        InvocationType='RequestResponse',
        LogType='Tail',
        Payload=payload,
        Qualifier=$LATEST
    )

响应有效负载的类型为<代码>

response_body = response['Payload']
response_str = response_body.read().decode('utf-8')
response_dict = eval(response_str)

现在,我需要异步调用我的lambda,所以我使用InvocationType='Event'更改调用类型

它给我一个与以前相同类型的有效载荷的响应,botocore.response.StreamingBody对象,但我在这一行得到错误-response_dict=val(response_str)

错误消息说

    response_dict = eval(response_str)
  File "<string>", line 0

    ^
SyntaxError: unexpected EOF while parsing

我错过了什么?如果响应负载与同步调用的类型相同,那么为什么会出现此解析错误?有什么建议吗?

编辑

为清楚起见,我理解如果调用类型为Event,那么我们只能得到调用的状态,而不能得到lambda函数的结果。但在我的情况下,我需要两者兼而有之——启动lambda异步并在完成后返回结果。我该怎么做?将结果写回s3并定期检查是否是唯一的选项?

共有1个答案

松思源
2023-03-14

InvocationType='Event'表示您没有收到响应。异步Lambda调用意味着您只想调用函数,而不是等待响应。服务丢弃来自函数的响应负载。

异步调用函数时,Lambda会将事件发送到队列。一个单独的进程从队列中读取事件并运行您的函数。将事件添加到队列时,Lambda将返回一个成功响应,而不返回其他信息。(增加强调)

https://docs.aws.amazon.com/lambda/latest/dg/invocation-async.html

请注意,这里提到的队列是Lambda服务内部的队列,不要与Amazon简单队列服务(SQS)混淆。

 类似资料:
  • TimeoutException:消息:异步脚本超时:30秒内未返回结果(会话信息:chrome=41.0.2272.118)(驱动程序信息:chromedriver=2.11.298604(75EA2FDB5C87F133A8E1B8DA16F6091FB7D5321E),平台=Windows NT 6.1 SP1x86_64)

  • 问题内容: 我有一个发出异步请求的函数。我如何从中返回响应/结果? 我尝试从回调中返回值,以及将结果分配给函数内部的局部变量并返回该局部变量,但这些方法均未真正返回响应(它们都返回或变量的初始值为任意值) 。 使用jQuery函数的示例: 使用node.js的示例: 使用承诺块的示例: 问题答案: 在 一 中的Ajax代表 异步 。这意味着发送请求(或接收响应)已从正常执行流程中删除。在您的示例中

  • 使用promise的块的示例:

  • 问题内容: 我有一个发出Ajax请求的函数。我如何从中返回响应? 我尝试从回调中返回值,以及将响应分配给函数内部的局部变量并返回该局部变量,但这些方法均未真正返回响应。 问题答案: 问题 在一中的Ajax代表异步。这意味着发送请求(或更确切地说接收响应)已从正常执行流程中删除。在你的示例中,立即返回并且在调用;作为回调传递的函数之前执行下一条语句。 这是一个类比,希望可以使同步流和异步流之间的区别

  • 输入:empID作为redis缓存的密钥 Redis缓存示例JSON数据: (关键)- 1 - 要求:遍历员工列表,并通过异步缓存调用为每个empID获取员工详细信息。 一旦所有异步调用完成。发送一份所有员工的名单和他们所有的细节。 完全的未来。SupplySync()执行该任务,但completableFuture的get()方法会等待每个异步调用完成。从而增加了响应时间。 甚至allOf()和

  • 我使用Java中的创建一个线程池,每个线程在其中执行一些异步任务/调用另一个服务。我不想等待回复,但无论何时回复都会返回。 这样做将等待第一个请求完成,然后返回结果。问题是,第二个请求必须等待第一个请求的响应返回,并且只有在这之后才会被处理。如果我使用CompletableFuture的方法,也会发生同样的情况,因为我还必须使用来获取响应。 我希望所有的请求都经过检查,并在收到时返回回复。这是可以