繁体   English   中英

在 Python 中制作异步 AWS Lambda Function

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM