Лучший способ использовать httpx async client и упорство?
Я получаю довольно разные результаты с двумя разными реализациями.
Вот реализация 1
request_semaphore = asyncio.Semaphore(5)
async def _send_async_request(client: AsyncClient, method, auth, url, body):
async with request_semaphore:
try:
async for attempt in AsyncRetrying(stop=stop_after_attempt(3), wait=wait_fixed(1)):
with attempt:
response = await client.request(method=method, url=url, auth=auth, json=body)
response.raise_for_status()
return response
except RetryError as e:
pass
А вот реализация 2:
request_semaphore = asyncio.Semaphore(5)
@retry(stop=stop_after_attempt(3), wait=wait_fixed(1))
async def _send_single_async_request(self, client: AsyncClient, method, auth, url, body):
async with request_semaphore:
response = await client.request(method=method, url=url, auth=auth, json=body)
response.raise_for_status()
return response
async def _send_async_request(self, client: AsyncClient, method, auth, url, body):
try:
await self._send_single_async_request(client, method, auth, request)
except RetryError as e:
pass
Я тестирую его на стабильном REST API. Вот ориентиры:
- 100 успешных запросов POST:
- Реализация 1: 0:59 мин.
- Реализация 2: 0:57 мин.
- 100 неудачных запросов POST:
- Реализация 1: 3:26 мин.
- Реализация 2: 2:09 мин.
Эти результаты согласуются. Может ли кто-нибудь помочь мне понять, почему моя первая реализация медленнее, чем вторая?
edit: FYI, вот как я вызываю вышеуказанные функции (вышеуказанные функции фактически получают кортеж запроса с URL-адресом и телом, отредактировал его для ясности)
async def _prepare_async_requests(method, auth, requests):
async with AsyncClient() as client:
task_list = [self._send_async_request(client, method, auth, request) for request in requests]
return [await task for task in asyncio.as_completed(task_list)]
def send_async_requests(auth, method, requests):
loop = asyncio.get_event_loop()
responses = loop.run_until_complete(self._prepare_async_requests(method, auth, requests))
return responses