小编典典

使用boto调用lambda函数如何异步执行此操作?

python

所以我正在使用boto调用我的lambda函数并测试我的后端。我想异步调用它们。我注意到“
invoke_async”已被弃用,不应使用。相反,您应该将InvocationType与“
Event”的InvocationType一起使用以异步执行该功能。

但是,我似乎无法弄清楚如何从函数中获取响应。我尝试了以下方法:

payload3=b"""{
"latitude": 39.5732160891,
"longitude": -119.672918997,
"radius": 100
}"""

client = boto3.client('lambda')
for x in range (0, 5):
    response = client.invoke(
        FunctionName="loadSpotsAroundPoint",
        InvocationType='Event',
        Payload=payload3
    )
    time.sleep(15)
    print(json.loads(response['Payload'].read()))
    print("\n")

即使我告诉代码休眠15秒钟,当我尝试打印它时,响应变量仍然为空。如果我将Invokation InvokationType更改为“
RequestResponse”,则一切正常,并且可以打印响应变量,但这是同步的。我错过了一些简单的事情吗?当异步调用返回时,我如何执行一些代码,例如打印结果?

谢谢。


阅读 218

收藏
2020-12-20

共1个答案

小编典典

异步执行的AWS Lambda函数不会返回执行结果。如果异步调用请求成功(即,没有由于权限等导致的错误),AWS
Lambda将立即返回HTTP状态代码202
ACCEPTED,
并且不承担与传递有关此异步调用结果的任何信息的进一步责任。

AWS Lambda
Invoke操作
的文档中:

响应语法

HTTP/1.1 StatusCode
X-Amz-Function-Error: FunctionError
X-Amz-Log-Result: LogResult

Payload

响应元素

如果操作成功,该服务将发回以下HTTP响应。

状态码

HTTP状态代码的成功范围将在200范围内。对于RequestResponse调用类型,此状态代码将为200。
对于Event调用类型,此状态代码将为202。对于DryRun调用类型,状态码将为204。

[…]

响应返回以下内容作为HTTP正文。

有效载荷

它是Lambda函数返回的对象的JSON表示形式。 仅当调用类型为时才存在RequestResponse

2020-12-20