Interviewers frequently go one layer deeper and ask questions such as:
- Why does FastAPI use Uvicorn?
- What exactly is ASGI?
- Why was ASGI introduced?
- How does ASGI differ from WSGI?
- Why are WebSockets possible in FastAPI but difficult in traditional WSGI applications?
These questions are designed to test architectural understanding rather than framework syntax.
In this article, we will explore ASGI from first principles and understand why it became the foundation of modern Python web frameworks such as FastAPI.
What Problem Was ASGI Trying to Solve?
Before ASGI existed, most Python web applications used WSGI (Web Server Gateway Interface).WSGI was introduced to standardize communication between Python web servers and Python web applications. It enabled frameworks such as Flask and Django to run on different web servers without requiring framework-specific integrations.
A simplified request flow looked like this: Client β Web Server β WSGI Server β Python Application
For many years this architecture worked extremely well because most web applications followed a simple request-response pattern. A client sends a request, the server processes it, the application generates a response, and the connection is then closed.
WSGI was designed for synchronous request-response communication and became the foundation of Python web development for more than a decade.However, modern applications started introducing new requirements.
Modern applications often need to support thousands of concurrent users, long-lived connections, WebSockets, real-time notifications, streaming responses, streaming requests, and Server-Sent Events (SSE). WSGI was not designed to handle these workloads efficiently.
Understanding the Limitation of WSGI
Consider a traditional synchronous request.def get_user():
data = database.fetch_user()
return data
While the application waits for the database response, the thread remains blocked. If 10,000 users connect simultaneously, thousands of threads may be required. This approach eventually becomes expensive because threads consume memory and operating system resources.
WSGI is not inherently slow. The limitation is that WSGI was designed around synchronous communication and cannot efficiently support modern asynchronous protocols.

Introducing ASGI
ASGI was created as the successor to WSGI. Its primary goal was to support asynchronous communication while maintaining compatibility with modern networking requirements.A simplified ASGI architecture looks like this: Client β Uvicorn β ASGI Interface β FastAPI Application
Instead of processing one request per thread, ASGI applications can handle many concurrent requests using an event loop. This allows the application to continue processing other requests while waiting for network operations, database calls, or external APIs.
How ASGI Works Internally
At a high level, ASGI defines a contract between the server and the application. The server provides three componentsβscope, receive, and sendβand the application receives these components to process requests and generate responses.A simplified ASGI application looks like this:
async def app(scope, receive, send):
await send({
"type": "http.response.start",
"status": 200
})
await send({
"type": "http.response.body",
"body": b"Hello World"
})
Although developers rarely write raw ASGI applications, understanding this structure is important because FastAPI ultimately operates on top of this contract.
When a request arrives, Uvicorn creates a scope object. A simplified example looks like this:
{
"type": "http",
"method": "GET",
"path": "/users/1"
}
The scope contains metadata about the connection and remains available throughout the request lifecycle. You can think of it as the request context maintained by the ASGI server.
When a client sends an HTTP request, Uvicorn performs several operations. First, it accepts the network connection. Next, it parses the HTTP request.
It then converts the request into ASGI messages and constructs the scope object. Finally, it invokes the FastAPI application using the ASGI protocol.
FastAPI processes the request and sends ASGI response messages back to Uvicorn. Uvicorn then converts those messages into HTTP packets and returns them to the client.
Why WebSockets Need ASGI
One of the most important reasons ASGI became popular is WebSocket support.Consider a chat application. The connection remains open for a long time. Messages can flow in both directions. This communication pattern does not fit the traditional request-response model used by WSGI.
ASGI was designed to support protocols beyond HTTP, including WebSockets. Example:
@app.websocket("/chat")
async def chat(websocket):
await websocket.accept()
while True:
message = await websocket.receive_text()
await websocket.send_text(message)
Without ASGI, frameworks such as FastAPI would not be able to support WebSockets natively.
ASGI vs WSGI
| Feature | WSGI | ASGI |
|---|---|---|
| Communication Model | Synchronous | Asynchronous |
| WebSockets | No Native Support | Native Support |
| Streaming | Limited | Supported |
| Concurrent Connections | Thread Based | Event Loop Based |
| Real-Time Applications | Difficult | Excellent |
Why FastAPI Chose ASGI
FastAPI was designed around asynchronous programming from the beginning. ASGI provides high concurrency, WebSocket support, streaming support, non-blocking request processing, and modern networking capabilities.These characteristics make ASGI an ideal foundation for FastAPI.
FastAPI's performance advantage is not primarily due to FastAPI itself. A significant portion comes from the ASGI architecture, asynchronous execution model, and efficient event-loop-based concurrency.
Interview Q&A
What does ASGI stand for? - ASGI stands for Asynchronous Server Gateway Interface.Why was ASGI introduced? - ASGI was introduced to support asynchronous communication, WebSockets, streaming, and modern high-concurrency workloads.
What problem does ASGI solve? - It eliminates many limitations of the synchronous WSGI model and enables efficient handling of large numbers of concurrent connections.
What role does Uvicorn play? - Uvicorn acts as the ASGI server responsible for network communication and forwarding ASGI messages to the application.
Can FastAPI run without ASGI? - No. FastAPI is an ASGI framework and requires an ASGI-compatible server such as Uvicorn.