为什么在AWS Lambda中request_async比aiohttp慢得多?

时间:2019-04-26 12:28:49

标签: python aws-lambda python-requests aiohttp

我正在重构以下函数,以使用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,并且通过lambda ping到相同的URL,那么这两个版本之间的性能没有明显差异。

在我的AWS Lambda中,响应版本比aiohttp版本慢3倍。

关于引起差异的原因有什么主意,为什么仅在aws lambda中执行时才会影响代码?

我一直在检查打包脚本安装的依赖版本是否与我在本地使用的依赖版本相同。

我还编辑了lambda,以在同一调用中依次执行两个版本,以确保执行上下文相同,但性能差异相同(3/1)。

0 个答案:

没有答案