Но это работает не так, как я ожидал. Такое ощущение, что мои запросы по-прежнему выполняются один за другим или, по крайней мере, не так одновременно, как обещает 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())
Это похоже на то, что asyncio.gather на самом деле не собирает их одновременно, или что-то глубоко блокирует. Что мне здесь не хватает? Есть ли какая-то общая ошибка с aiohttp или asyncio.gather, из-за которой что-то блокируется, когда вы этого не ожидаете?
Я проверил:
- Версия Python (3.9+)
- версия (последняя)
Код: Выделить всё
aiohttp - Очевидного ожидания нет отсутствует
Подробнее здесь: https://stackoverflow.com/questions/798 ... s-blocking