【问题标题】:Make Async AWS Lambda Function in Python在 Python 中创建异步 AWS Lambda 函数
【发布时间】:2020-06-03 16:19:40
【问题描述】:

我正在考虑在 aws lambda 中进行一次触发并忘记函数调用。

我正在使用 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 函数被执行为火灾并忘记,但发生的是我的 lambda 函数正在等待 process_trigger_data 在“返回响应”之前完全执行。

我应该怎么做才能触发并忘记函数调用? 我已经尝试创建 process_trigger_data 的 api 函数,以便它应该运行另一个 aws 实例,但我得到相同的结果,它在返回响应之前等待完成

我应该怎么做?

谢谢

【问题讨论】:

    标签: python asynchronous aws-lambda


    【解决方案1】:

    因此,当您在 Lambda 中执行任务时,它会等到所有进程都完成后再执行/或超时。

    有两种方法可以解决这个问题。

    1) 您可以使用 SNS 发布带有另一个 Lamdba 订阅的有效负载的消息。

    这样做的陷阱是,如果您的函数变得非常繁忙,那么您的 Lambda 可以默认扇出一个非常高的数字 - 如果您有来自这些 Lambda 的数据库连接,那么它可以最大化您的连接池。

    2) 如果可能有很多此类任务,则 SQS 是一个更好的选择,因为您使用 Lambda 只会尽可能快地处理消息,而不会产生大的扇出。

    我建议使用 SQS:https://docs.aws.amazon.com/lambda/latest/dg/with-sqs.html

    SNS 文档在这里:https://docs.aws.amazon.com/lambda/latest/dg/with-sns.html

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-07-12
      • 2020-07-28
      • 2016-09-18
      • 2019-02-14
      • 1970-01-01
      • 2020-01-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多