我正在重构以下函数,以使用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)。