Search code examples
pythontimeoutaiohttp

python aiohttp timeout is for a single TCP connection or for a http request?


In python aiohttp, we can set a timeout either in ClientSession or in a (for example) session.get. https://docs.aiohttp.org/en/stable/client_quickstart.html

Suppose we do

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

The customized timeout is for the whole async with aiohttp.ClientSession() or for each async with session.get?


Solution

  • The timeout is for each individual request; you can test it like:

    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())
    

    Result on my computer:

    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