繁体   English   中英

使用 async/await 从 python 异步调用 AWS Lambda function

[英]calling an AWS Lambda function asynchronously from python with async/await

我有一个 AWS lambda function 我需要异步调用(即发即弃)并在以非阻塞方式完成时取回结果。

loop = asyncio.get_event_loop()

async def f(payload):
    lambda_client = boto3.client('lambda')
    response = lambda_client.invoke(
    FunctionName='FUNC_NAME',
    InvocationType='RequestResponse',
    LogType='Tail',
    Payload=payload,
    Qualifier='$LATEST'
    )
    response_body = response['Payload']
    response_str = response_body.read().decode('utf-8')
    response_dict = eval(response_str)
    return response_dict


async def g():

    payload = json.dumps({
      "test_bucket": "MY_BUCKET",
      "test_key": "my_test_key.csv",
      "testpred_bucket": "MY_BUCKET",
      "testpred_key": "my_test_key_new.csv",
      "problem": "APROBLEM"
    })
    # Pause here and come back to g() when f() is ready
    r = await f(payload)
    print(r)

这行得通,但这并不能真正达到fire and forget的目的。 我知道我需要使用asyncio.ensure_future但是如果我这样做asyncio.ensure_future(f(payload)) ,我如何捕获 function f的返回值。 我是 python 异步的新手,目前还不清楚。

有人可以建议吗?

  • 这就是我在我的 aws lambda 中所做的,我想做 4 个发布请求,然后收集所有响应。
    loop = asyncio.get_event_loop()

    if loop.is_closed():
        loop = asyncio.new_event_loop()

    #The perform_traces method i do all the post method
    task = loop.create_task(perform_traces(payloads, message, contact_centre))
    unique_match, error = loop.run_until_complete(task)
    loop.close()

perform_trace方法中,这就是我使用等待 session 的方式

    future_dds_responses = []

    async with aiohttp.ClientSession() as session:

        for payload in payloads:
            future_dds_responses.append(dds_async_trace(session, payload, contact_centre))

        dds_responses, pending = await asyncio.wait(future_dds_responses)

dds_async_trace这就是我使用 aiohttp.ClientSession session 完成帖子的方式

        async with session.post(pds_url,
                                data=populated_template_payload,
                                headers=PDS_HEADERS,
                                ssl=ssl_context) as response:
            status_code = response.status

我能够用asyncio.ensure_future解决这个问题

import boto3
import json
from flask import jsonify
import signal
import sys
import asyncio
import aiohttp
import json


def run():
    loop = asyncio.get_event_loop()
    loop.run_until_complete(run_job())


async def run_job():
    asyncio.ensure_future(launch_lambda())  # fire and forget async_foo()
    print('waiting for future ...')

async def launch_lambda():

    payload = json.dumps({
      "test_bucket": "my_bucket",
      "test_key": "my_test_key",
      "testpred_bucket": "my_bucket",
      "testpred_key": "my_pred_key",
      "problem": "APROBLEM"
    })
    result = await get_lambda_response(payload)
    print(result)

async def get_lambda_response(payload):
        lambda_client = boto3.client('lambda')
        response = lambda_client.invoke(
        FunctionName='FUNC_NAME',
        InvocationType='RequestResponse',
        LogType='Tail',
        Payload=payload,
        Qualifier='$LATEST'
        )
        response_body = response['Payload']
        response_str = response_body.read().decode('utf-8')
        response_dict = eval(response_str)
        return response_dict


run()

您需要将 InvocationType 设置为 'Event'

import boto3

lambda_client = boto3.client('lambda')
lambda_payload = {"name:"name","age":"age"}
lambda_client.invoke(FunctionName='myfunctionname', 
                     InvocationType='Event',
                     Payload=lambda_payload)

有关更多信息,请参阅: https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/lambda.html#Lambda.Client.invoke

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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