Я пытаюсь создать лямбду Python3.7, который правильно использует asyncio для многопоточности.
Я пробовал много разных вариантов кода, но вот последний блок. Я использую AWS Xray, чтобы посмотреть на время, и легко проверить, что асинхронность не работает правильно. Все эти задачи и звонки выполняются синхронно.
import json
import boto3
import asyncio
from botocore.exceptions import ClientError
from aws_xray_sdk.core import xray_recorder
from aws_xray_sdk.core import patch_all
#xray
patch_all()
def lambda_handler(event, context):
tasks = []
dict_to_populate = {}
for item in list:
tasks.append(asyncio.ensure_future(do_work(item, dict_to_populate)))
loop = asyncio.get_event_loop()
loop.run_until_complete(asyncio.gather(*tasks))
loop.close
async def do_work(item, dict_to_populate):
#assume regions are obtained
for region in regions:
response_vpcs = describe_vpcs(obj['Id'], session_assumed, region)
if 'Vpcs' in response_vpcs:
for vpc in response_vpcs['Vpcs']:
#process
Я ожидаю увидеть, что функции do_work запускаются практически в одно и то же время (асинхронно), но все они синхронны в соответствии с XRAY. Он обрабатывается синхронно и заполняет dict_to_populate, как и ожидалось.