Overview
Pounce follows a three-layer architecture: Server orchestrates lifecycle, Supervisor manages workers, and Workers handle requests. All layers share a single frozenServerConfig— no synchronization needed.
Server Layer
TheServerclass orchestrates the full lifecycle:
- CONFIG — Validate and freeze
ServerConfig - DETECT — Check for free-threading via
sys._is_gil_enabled() - BIND — Create listening sockets with
SO_REUSEPORT - LIFESPAN — Run ASGI lifespan protocol (
startup/shutdown) - SERVE — Delegate to single-worker fast path or multi-worker supervisor
- SHUTDOWN — Graceful connection draining, signal handling
For single-worker mode (workers=1), the server skips the supervisor entirely and runs the worker directly — no thread/process overhead.
Supervisor Layer
TheSupervisormanages worker lifecycle:
- Spawn — Creates N worker threads (nogil) or processes (GIL)
- Monitor — Health-check loop with automatic restart (max 5 restarts per 60s window)
- Reload — Graceful restart of all workers when
--reloaddetects changes - Shutdown — Signals all workers to stop, waits for connection draining
Worker Layer
EachWorkerruns its own asyncio event loop:
- Accept — Receive TCP connections from the shared socket
- Parse — Feed bytes to protocol parser (h11, h2, or wsproto)
- Bridge — Build ASGI scope, create
receive/sendcallables - Dispatch — Call
app(scope, receive, send) - Respond — Serialize response and write to socket (streaming)
Workers are fully independent. No shared mutable state, no locks, no coordination between workers during request handling.
Request Pipeline
A single HTTP request flows through:
The bridge is per-request — created and destroyed within a single connection handler. This ensures zero cross-request state leakage.
Module Map
| Module | Layer | Purpose |
|---|---|---|
server.py |
Server | Lifecycle orchestration |
supervisor.py |
Supervisor | Worker spawn/monitor |
worker.py |
Worker | asyncio loop, request handling |
config.py |
Shared | FrozenServerConfig |
protocols/h1.py |
Protocol | HTTP/1.1 via h11 |
protocols/h1_httptools.py |
Protocol | HTTP/1.1 via httptools |
protocols/h2.py |
Protocol | HTTP/2 via h2 |
protocols/ws.py |
Protocol | WebSocket via wsproto |
asgi/bridge.py |
Bridge | HTTP ASGI scope/receive/send |
asgi/h2_bridge.py |
Bridge | HTTP/2 ASGI bridge |
asgi/ws_bridge.py |
Bridge | WebSocket ASGI bridge |
asgi/lifespan.py |
Bridge | ASGI lifespan protocol |
net/listener.py |
Network | Socket bind, SO_REUSEPORT, UDS |
net/tls.py |
Network | TLS context creation |
_proxy.py |
Security | Proxy header validation |
_request_id.py |
Observability | Request ID generation/extraction |
_health.py |
Observability | Built-in health check endpoint |
metrics.py |
Observability | Prometheus-compatible metrics |
See Also
- Thread Safety — How shared state works
- Performance — Streaming-first design
- Protocols — Protocol handler details