тайм-аут python aiohttp для одного TCP-соединения или для http-запроса?

#python #timeout #aiohttp

#питон #тайм-аут #aiohttp #python

Вопрос:

В python aiohttp мы можем установить тайм-аут либо в ClientSession , либо в a (например) session.get . https://docs.aiohttp.org/en/stable/client_quickstart.html

Предположим, мы это сделаем

 async with aiohttp.ClientSession(timeout=<customized timeout>) as session: 
    async with session.get(<url1>): 
        xxx
    async with session.get(<url2>): 
        xxx
  

customized timeout Это для всего async with aiohttp.ClientSession() или для каждого async with session.get ?

Ответ №1:

Тайм-аут предназначен для каждого отдельного запроса; вы можете протестировать его следующим образом:

 import asyncio
import aiohttp
import random

async def main():
    timeout = aiohttp.ClientTimeout(total=3)
    async with aiohttp.ClientSession(timeout=timeout) as session:
        base_url = "http://httpbin.org/delay/%d"
        for i in range(10):
            url = base_url % random.randint(1, 5)
            try:
                async with session.get(url) as response:
                    data = await response.json()
                    print(f"step {i}, url {url}, status {response.status}, keys: {len(data)}")
            except asyncio.exceptions.TimeoutError:
                print(f"step {i}, url {url}, status timeout")

asyncio.run(main())
  

Результат на моем компьютере:

 step 0, url http://httpbin.org/delay/5, status timeout
step 1, url http://httpbin.org/delay/5, status timeout
step 2, url http://httpbin.org/delay/2, status 200, keys: 7
step 3, url http://httpbin.org/delay/4, status timeout
step 4, url http://httpbin.org/delay/4, status timeout
step 5, url http://httpbin.org/delay/3, status 200, keys: 7
step 6, url http://httpbin.org/delay/2, status 200, keys: 7
step 7, url http://httpbin.org/delay/3, status 200, keys: 7
step 8, url http://httpbin.org/delay/1, status 200, keys: 7
step 9, url http://httpbin.org/delay/2, status 200, keys: 7
  

Комментарии:

1. Рад, что ответ был полезным; если на ваш вопрос был дан ответ, пожалуйста, отметьте его как решенный