Я выполняю рефакторинг следующих функций, чтобы использовать 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).