Python Async
Overview
Asyncio is a concurrency model designed for IO-bound and high-level structured network code. It uses cooperative multitasking on a single thread, allowing routines to pause while waiting for I/O, yielding control back to the event loop.
When to Use
- Network IO: Web scraping, API requests, and database queries.
- Web Servers: Handling thousands of concurrent connections (e.g., FastAPI).
- Concurrent Tasks: Running multiple independent IO-bound operations simultaneously.
Decision Tree
- Is the task CPU-bound (e.g., heavy math, image processing)?
- YES: Use
multiprocessinginstead. - NO: Is the task waiting for external resources (API, Disk)?
- YES: Use
asyncio.
- YES: Use
- YES: Use
- Are you using
time.sleep?- YES: Replace with
await asyncio.sleepto avoid blocking the event loop.
- YES: Replace with
Workflows
1. Concurrent Task Execution
- Define multiple coroutine functions with
async def. - Initiate the tasks using
asyncio.gather(*coros)to run them concurrently. - Await the results to aggregate outputs efficiently.
2. Asynchronous Resource Management
- Implement an asynchronous context manager using
__aenter__and__aexit__. - Use the
async withsyntax to ensure resources (like network connections) are opened and closed without blocking the loop. - Perform I/O operations inside the context using
await.
3. Processing Async Streams
- Create an asynchronous generator using
yieldinside anasync deffunction. - Iterate over the generator using
async forto process data as it becomes available. - Avoid materializing the entire sequence in memory to keep memory overhead low.
Non-Obvious Insights
- Cooperative Multitasking: Async is NOT parallelism; it is single-threaded. If one coroutine blocks (e.g.,
time.sleep), the entire program stops. - Modern Entry Point: Always use
asyncio.run(main())for the main entry point; avoid manual event loop management in modern Python. - Materialization Risk: Using
async foris essential for large datasets to prevent OOM (Out of Memory) errors by processing items one by one as they arrive.
Evidence
- "asyncio is often a perfect fit for IO-bound and high-level structured network code." - Python Docs
- "Async I/O is a single-threaded, single-process technique that uses cooperative multitasking." - Real Python
- "The await keyword suspends the execution of the surrounding coroutine and passes control back to the event loop." - Real Python
Scripts
scripts/python-async_tool.py: Examples ofasyncio.gatherandasync forgenerators.scripts/python-async_tool.js: Equivalent JavaScriptPromise.alland async iterator examples.
Dependencies
asyncio(Standard Library)aiohttporhttpx(Recommended for async HTTP)