你如何让 python aws lambda 处理程序进行一个异步调用,这需要很长时间,但立即让 lambda return 一个 requestId 作为响应
how do you make a python aws lambda handler make an async call that takes a long time but have the lambda immediately return a requestId as a response
我正在尝试使用 asyncio 库执行此操作,但我不太了解它是如何工作的。它不应该像在处理程序中调用 async 函数一样简单而前面没有 await 吗?例如
def my_handler(event, context):
someAsyncFunction()
return random_request_id
请注意,我不想等待 someAsyncFunction
到 return
AWS Lambda 无法按照您尝试使用的方式工作。只要您在 Lambda 函数的处理程序中调用 return
,整个函数运行时就会被 AWS 停止。当同一个 Lambda 调用仍在后台执行任何类型的处理任务时,不可能 return 来自 Lambda 调用的响应。
您可以做的是创建两个 Lambda 函数:
函数 1:
- 将
random_request_id
作为输入,进行更长的 运行 处理并退出。
函数 2:
- 创建一个 random_request_id,使用 invocation type Event 调用函数 1,因此它不会等待 Lambda 函数完成,并且 return 是
random_request_id
。
您也可以考虑在两个 Lambda 函数之间放置一个 SQS 队列来解耦它们。
这种多 Lambda 函数工作流很快就会变得笨拙,因此我建议研究 AWS Step Functions 来协调此工作流。
我正在尝试使用 asyncio 库执行此操作,但我不太了解它是如何工作的。它不应该像在处理程序中调用 async 函数一样简单而前面没有 await 吗?例如
def my_handler(event, context):
someAsyncFunction()
return random_request_id
请注意,我不想等待 someAsyncFunction
到 return
AWS Lambda 无法按照您尝试使用的方式工作。只要您在 Lambda 函数的处理程序中调用 return
,整个函数运行时就会被 AWS 停止。当同一个 Lambda 调用仍在后台执行任何类型的处理任务时,不可能 return 来自 Lambda 调用的响应。
您可以做的是创建两个 Lambda 函数:
函数 1:
- 将
random_request_id
作为输入,进行更长的 运行 处理并退出。
函数 2:
- 创建一个 random_request_id,使用 invocation type Event 调用函数 1,因此它不会等待 Lambda 函数完成,并且 return 是
random_request_id
。
您也可以考虑在两个 Lambda 函数之间放置一个 SQS 队列来解耦它们。
这种多 Lambda 函数工作流很快就会变得笨拙,因此我建议研究 AWS Step Functions 来协调此工作流。