Используйте asyncio.wait вместо asyncio.gather
Также см. этот QA для получения дополнительной информации о различиях.
Примечание: ожидание timeout
аргумент выражается в секундах.
Прежде всего, вам вообще может не потребоваться указывать тайм-аут для ClientSession.
Переработанный код (для увеличения дисперсии времени отклика) Я добавил несколько разных источников, и 20 запросов были выполнены)
import asyncio
import random
import aiohttp
import requests
sources = ["amazon.com", "hotmail.com", "stackoverflow.com"]
async def fetch(session):
rnd = random.choice(sources)
async with session.get(f"https://{rnd}") as response:
return response.status
async def main(n, timeout):
async with aiohttp.ClientSession() as session:
completed, pending = await asyncio.wait(
[fetch(session) for _ in range(n)],
timeout=timeout
)
for t in pending: # cancel the pending tasks
t.cancel()
return [t.result() for t in completed]
timeout = 0.5
res = asyncio.run(main(20, timeout))
print(res)
с увеличением значений timeout
, поскольку 0,3, 0,5 и 0,8 производят
(.venv) async_req_timeout $ python async_req_timeout.py
[200, 200]
(.venv) async_req_timeout $ python async_req_timeout.py
[200, 200, 200, 200, 200, 200, 200, 200, 200, 200]
(.venv) (base) async_req_timeout $ python async_req_timeout.py
[200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200]