Почему request_async значительно медленнее, чем aiohttp в aws lambda? - PullRequest
2 голосов
/ 26 апреля 2019

Я выполняю рефакторинг следующих функций, чтобы использовать requests_async вместо aiohttp

Оригинальный код:

async def ping_url(session, url):
    logger.debug('Ping: %s', url)
    try:
        response = await session.get(url)
    except asyncio.TimeoutError:
        logger.info('Ping timeout for %s', url)
        return ('TIMEOUT', url)
    else:
        logger.debug('Ping done for %s', url)
        return (response.status, url)


async def ping_urls(urls, headers=None):
    async with aiohttp.ClientSession(timeout=timeout, headers=headers) as session:
        tasks = [
            asyncio.create_task(
                ping_url(session, url)
            ) for url in urls
        ]
        ping_results = await asyncio.gather(*tasks)

    return ping_results

После рефакторинга:

async def ping_url(session, url):
    logger.debug('Ping: %s', url)
    try:
        response = await session.get(url)
    except requests_async.exceptions.Timeout:
        logger.info('Ping timeout for %s', url)
        return ('TIMEOUT', url)
    else:
        logger.debug('Ping done for %s', url)
        return (response.status_code, url)


async def ping_urls(urls, headers=None):
    async with requests_async.Session() as session:
        session.headers.update(headers or {})
        session.timeout = 2
        tasks = [
            asyncio.create_task(
                ping_url(session, url)
            ) for url in urls
        ]
        ping_results = await asyncio.gather(*tasks)

    return ping_results

Если я запускаю на своем компьютере ping_urls coro с тем же URL-адресом, который пингует моя лямбда, то между этими двумя версиями не будет существенной разницы в производительности.

Внутри лямбды AWS версия ответа будет в 3 раза медленнеечем версия aiohttp.

Есть идеи о том, что может быть причиной различия и почему это влияет на код только тогда, когда он выполняется в лямбда-выражении aws?

Я проверялчто версия зависимостей, установленных моими скриптами упаковки, совпадает с версией, которую я использую локально.

Я также отредактировал свою лямбду, чтобы последовательно выполнять обе версии в одном и том же вызове, чтобы гарантировать, что контекст выполнения одинаков, но различия в производительности одинаковы (3/1).

...