如何解决Python3.8 Asyncio-从字典列表中返回结果
我真的很想弄清楚如何使用asyncio从一堆AWS Lambda调用中返回一堆结果,这是我的示例。
我的团队拥有大量AWS账户。为了节省时间,我想运行一个异步的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))
我正在努力弄清如何以异步方式进行此操作。我最初设法使用并发的期货线程池执行程序来实现这一目标,但是我遇到了一些性能问题,但这就是我所拥有的。
executor = concurrent.futures.ThreadPoolExecutor(max_workers=50)
sg_data = executor.map(call_lambda,account_data)
所以这行得通,但效果不佳,我被告知去做asyncio。我阅读这些下面的文章,但我仍然只是失去了对如何使这项工作。我知道AWS Lambda本身是异步的,并且在没有协程的情况下应该可以正常工作。
tl; dr是我想为列表中的每个Dict开始使用call_lambda(acct)(account_data是词典的列表),然后将所有结果再次返回到Dict的一个大列表中。 (最终将其写入CSV,以及有关为什么不将其输入数据库的公司政策问题)。
我已阅读以下内容,但仍感到困惑...
https://stackabuse.com/python-async-await-tutorial/
解决方法
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'只是更新文件,您可能会用这种方式得到所需的内容。 / p>
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。