Skip to content

Async HTTP with aiohttp

Why aiohttp

The requestsrequests library is blocking.

For asyncio, you typically use:

  • aiohttpaiohttp

It supports non-blocking HTTP requests.

Basic GET

aiohttp_get.py
import asyncio
import aiohttp
 
 
async def main():
    timeout = aiohttp.ClientTimeout(total=10)
 
    async with aiohttp.ClientSession(timeout=timeout) as session:
        async with session.get("https://api.github.com") as resp:
            data = await resp.json()
            print(resp.status)
            print(list(data.keys())[:5])
 
 
asyncio.run(main())
aiohttp_get.py
import asyncio
import aiohttp
 
 
async def main():
    timeout = aiohttp.ClientTimeout(total=10)
 
    async with aiohttp.ClientSession(timeout=timeout) as session:
        async with session.get("https://api.github.com") as resp:
            data = await resp.json()
            print(resp.status)
            print(list(data.keys())[:5])
 
 
asyncio.run(main())

Fetch many URLs concurrently

aiohttp_many.py
import asyncio
import aiohttp
 
 
async def fetch(session: aiohttp.ClientSession, url: str) -> int:
    async with session.get(url) as resp:
        await resp.read()
        return resp.status
 
 
async def main():
    urls = [
        "https://httpbin.org/delay/1",
        "https://httpbin.org/delay/1",
        "https://httpbin.org/delay/1",
    ]
 
    timeout = aiohttp.ClientTimeout(total=5)
 
    async with aiohttp.ClientSession(timeout=timeout) as session:
        statuses = await asyncio.gather(*(fetch(session, u) for u in urls), return_exceptions=True)
        print(statuses)
 
 
asyncio.run(main())
aiohttp_many.py
import asyncio
import aiohttp
 
 
async def fetch(session: aiohttp.ClientSession, url: str) -> int:
    async with session.get(url) as resp:
        await resp.read()
        return resp.status
 
 
async def main():
    urls = [
        "https://httpbin.org/delay/1",
        "https://httpbin.org/delay/1",
        "https://httpbin.org/delay/1",
    ]
 
    timeout = aiohttp.ClientTimeout(total=5)
 
    async with aiohttp.ClientSession(timeout=timeout) as session:
        statuses = await asyncio.gather(*(fetch(session, u) for u in urls), return_exceptions=True)
        print(statuses)
 
 
asyncio.run(main())

Notes

  • Use timeouts.
  • Handle non-200 responses.
  • Avoid hitting API rate limits (use semaphores).

๐Ÿงช Try It Yourself

Exercise 1 โ€“ Your First Coroutine

Exercise 2 โ€“ await asyncio.sleep

Exercise 3 โ€“ Gather Two Coroutines

If this helped you, consider buying me a coffee โ˜•

Buy me a coffee

Was this page helpful?

Let us know how we did