![](/img/trans.png)
[英]calling an AWS Lambda function asynchronously from python with async/await
[英]Make Async AWS Lambda Function in Python
我正在考虑生火并忘记在aws lambda中调用function。
我正在使用 FASTAPI
我做了以下事情:
from fastapi import APIRouter, BackgroundTasks
router = APIRouter()
@router.post('/post_trigger_data')
async def post_trigger_data(trigger_data: TriggerData, background_tasks: BackgroundTasks):
data = {
'uuid': trigger_data.uuid,
'status': 'Initializing',
'status_message': '',
'form_body': trigger_data.data
}
utils.post_data_to_dynamo_db('TriggerProcessingTableName', data)
background_tasks.add_task(process_trigger_data, trigger_data.uuid) # This is where it should fire and forget
return response
def process_trigger_data(uuid: str):
time.sleep(10)
data = {'data': 'RUN 1', 'uuid': uuid, 'status': 'Pending'}
utils.post_data_to_dynamo_db('TriggerProcessingTableName', data)
time.sleep(10)
data = {'data': 'RUN 2', 'uuid': uuid, 'status': 'OK'}
utils.post_data_to_dynamo_db('TriggerProcessingTableName', data)
return data
我期待 process_trigger_data function 作为火灾执行并忘记,但发生的是我的 lambda function 在“完全等待响应之前执行”
我该怎么做才能生火并忘记 function 调用? 我尝试创建一个 api function 的 process_trigger_data 以便它应该运行另一个 aws 实例但我得到相同的结果,它在返回响应之前等待完成
我该怎么做?
谢谢
因此,当您在 Lambda 中执行任务时,它会等到所有进程完成后再执行/或超时。
有两种方法可以解决这个问题。
1) 您可以使用 SNS 发布带有另一个 lamdba 订阅的有效负载的消息。
这样做的缺陷是,如果您的 function 变得非常忙碌,那么您的 Lambda 可以默认扇出一个非常高的数量 - 如果您有来自这些 Lambda 的数据库连接,那么它可以最大化您的连接池。
2) 如果可能有很多这样的任务,SQS 是一个更好的选择,因为您使用 Lambda(s) 只会尽可能快地处理消息,而不会产生大的扇出。
SQS 是我推荐的: https://docs.aws.amazon.com/lambda/latest/dg/with-sqs.html
SNS 文档在这里: https://docs.aws.amazon.com/lambda/latest/dg/with-sns.html
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.