Asyncio не работает в моей Python3.7 lambda - PullRequest
0 голосов
/ 02 октября 2019

Я пытаюсь создать лямбду 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, как и ожидалось.

1 Ответ

1 голос
/ 02 октября 2019
  • Вот так я и сделал в своей aws лямбде, я хотел сделать 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 так я использовал wait with 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...