Почему мои HTTP-запросы Asyncio блокируются?Python

Программы на Python
Anonymous
 Почему мои HTTP-запросы Asyncio блокируются?

Сообщение Anonymous »

Я пытаюсь использовать asyncio и aiohttp, чтобы сделать несколько HTTP-запросов очень быстрыми, без блокировки. Суть в том, чтобы одновременно обратиться к множеству URL-адресов и дождаться их всех.
Но это работает не так, как я ожидал. Такое ощущение, что мои запросы по-прежнему выполняются один за другим или, по крайней мере, не так одновременно, как обещает asyncio. Я прочитал всю документацию и руководства, и мой код выглядит довольно стандартно для подобных вещей, но он работает медленно.
Вот упрощенная версия того, что я делаю. Представьте, что get_some_data выполняет настоящий вызов aiohttp.ClientSession().get().

Код: Выделить всё

import asyncio
import aiohttp
import time

async def get_some_data(session, url):
print(f"Starting {url}")
# In my real code, this is an actual aiohttp request
# For now, simulating work
await asyncio.sleep(2) # Simulate network latency and processing
print(f"Finished {url}")
return f"Data from {url}"

async def main():
urls = [
"http://example.com/api/1",
"http://example.com/api/2",
"http://example.com/api/3",
"http://example.com/api/4",
"http://example.com/api/5",
]

start_time = time.time()

async with aiohttp.ClientSession() as session:
tasks = []
for url in urls:
tasks.append(get_some_data(session, url))

results = await asyncio.gather(*tasks)

end_time = time.time()

print(f"\nAll tasks completed in {end_time - start_time:.2f} seconds.")
for result in results:
print(result)

if __name__ == "__main__":
asyncio.run(main())

Когда я запускаю это, я ожидаю, что это займет около 2 секунд, потому что все вызовы asyncio.sleep(2) должны выполняться одновременно. Но это занимает около 10 секунд (5 URL-адресов * 2 секунды каждый).
Это похоже на то, что asyncio.gather на самом деле не собирает их одновременно, или что-то глубоко блокирует. Что мне здесь не хватает? Есть ли какая-то общая ошибка с aiohttp или asyncio.gather, из-за которой что-то блокируется, когда вы этого не ожидаете?
Я проверил:
  • Версия Python (3.9+)
  • версия (последняя)
  • Очевидного ожидания нет отсутствует
Есть идеи?

Подробнее здесь: https://stackoverflow.com/questions/798 ... s-blocking

Вернуться в «Python»