【问题标题】:Python3.8 Asyncio - Return Results from List of DictionariesPython3.8 Asyncio - 从字典列表返回结果
【发布时间】:2021-02-21 21:43:45
【问题描述】:

我真的很难弄清楚如何使用 asyncio 从一堆 AWS Lambda 调用中返回一堆结果,这是我的示例。

我的团队拥有一堆 AWS 账户。由于时间关系,我想运行一个 async of AWS lambda 函数来处理每个账户的信息,并返回结果。我试图了解如何创建快速发送一大堆帐户的异步操作,而不是一次发送一个。这是我的示例代码。

def call_lambda(acct):

    aws_lambda = boto3.client('lambda', region_name='us-east-2')
    aws_payload = json.dumps(acct)

    response = aws_lambda.invoke(
    FunctionName='MyLambdaName',
    Payload=aws_payload,
    )

    return json.loads(response['Payload'].read())

def main():
    scan_time = datetime.datetime.utcnow()
    accounts = []
    scan_data = []
    account_data = account_parser()

    for account_info in account_data:
        account_info['scan_time'] = scan_time

    for account in account_data:
        scan_data.append(call_lambda(account))

我正在努力弄清楚如何以 asyncio 风格做到这一点。我最初设法使用并发期货线程池执行器来完成它,但我遇到了一些性能问题,但这就是我所遇到的。

executor = concurrent.futures.ThreadPoolExecutor(max_workers=50)
sg_data = executor.map(call_lambda, account_data)

所以这行得通,但效果不佳,我被告知改为执行 asyncio。我阅读了以下这些文章,但我仍然对如何使这项工作感到迷茫。我知道 AWS Lambda 本身是异步的,没有协程应该也能正常工作。

tl;dr 是我想为列表中的每个字典启动 call_lambda(acct)(account_data 是字典列表),然后将所有结果再次返回到一个大字典列表中。 (这最终会被写入 CSV,为什么不进入数据库的公司政策问题)。

我已经阅读了以下内容,仍然感到困惑......

https://stackabuse.com/python-async-await-tutorial/

【问题讨论】:

  • 您查看过 aiobotocore 的文档吗?
  • 是的,但它似乎工作基本相同,除非我错过了什么

标签: python python-3.x asynchronous python-asyncio python-3.8


【解决方案1】:

Lambda 调用默认是同步的 (RequestResponse),因此您必须将 InvocationType 指定为 Event。通过这样做,尽管您没有得到您的回应来整理您想要的帐户信息。因此希望使用异步或类似的东西。

response = client.invoke(
    FunctionName='string',
    InvocationType='Event'|'RequestResponse'|'DryRun',
    LogType='None'|'Tail',
    ClientContext='string',
    Payload=b'bytes'|file,
    Qualifier='string'
)

我没有在 lambda 中实现异步,但作为替代解决方案,如果您可以创建一个 s3 文件,那么每次调用 FunctionName='MyLambdaName' 只需更新该文件,您可能会通过这种方式获得所需的内容。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-31
    • 2021-05-19
    相关资源
    最近更新 更多