Tornado fits services that keep connections open
A WebSocket connection can spend most of its life waiting. Tornado is a Python web framework and asynchronous networking library intended for applications with long-lived connections, including WebSockets and long polling. It merits a trial when the team can keep blocking work out of the event loop.
The project includes its own HTTP server and asynchronous HTTP client. Its documentation recommends writing applications against Tornado's own interfaces directly; WSGI support is not a focus of development. Choosing Tornado therefore includes a decision about application structure and deployment.
The supplied repository run installed and built successfully, but its test command failed. That leaves verification unresolved. The run does not establish production reliability or connection capacity.
What happened when we ran it
Tornado installed in 29 seconds and built in 2 seconds in the sandbox. Its test command exited 1 after 47 seconds. The record lists 662 passed, 198 failed, 192 skipped and 2 collection/setup errors, alongside a separately recorded total of 862. These figures are not reconciled, so they do not support a pass percentage.
Several visible failures are in tornado/test/simple_httpclient_test.py. They report "Unexpected logs found" and include INFO entries from tornado.access. The no-content case includes an HTTP 204 access entry. Other visible entries concern redirects, timeouts and streaming callbacks. The tail shows the assertion in those examples, but it does not establish the cause of every failure or expose the underlying exceptions for both errors. The exact test invocation is not supplied, which limits reproduction from this record alone.
The run measured commit 57deb98 on October 30, 2026, with 3 CPUs and 8 GB RAM. The image label was ghcr.io/astral-sh/uv:python3.12-bookworm. That label does not establish the actual Python or operating-system version. The record lists 79 dependencies and 190 MB on disk. Pip-audit reported 0 known vulnerabilities, with 78 packages scanned and one package skipped. That result covers the recorded scan, not every possible security issue.
The checkout had 335 files, approximately 55,285 source lines and 2.6 MB. The scan detected 3 CI workflow files, no Dockerfile and no tests directory. The failure paths show tests under tornado/test, so the directory signal does not establish that the project lacks tests. No connection-capacity or request-latency benchmark accompanies this run.
Blocking calls still stop the event loop
Tornado uses a single-threaded event loop. Its asynchronous I/O guide says application code should be asynchronous and non-blocking because only one operation can be active at a time. Declaring an async function does not make a synchronous network operation inside it non-blocking. The guide demonstrates an asynchronous fetch with AsyncHTTPClient and await.
Disk I/O and CPU work can also block. For a proposed service, review what a handler does while another connection waits. The main documentation recommends IOLoop.run_in_executor for blocking code and warns that the function passed to it should avoid referencing Tornado objects. This is a documented option, not an approach exercised by the supplied run.
Tornado shares an event loop with asyncio, and its documentation says libraries designed for asyncio can generally be mixed with Tornado. Compatibility with a particular database client or other library was not verified here.
You manage the server processes
Tornado supplies its own HTTPServer. The deployment guide describes starting it from a main function and configuring an operating system or process manager to run the program.
The guide discusses multiple application processes, external load balancing when processes listen on different ports, and open-file limits that may need adjustment. Include those responsibilities in a trial. A successful package build does not establish that a deployment layout or connection limit suits your service.
Tornado's documentation says Windows is not officially supported or recommended for production use. It also identifies missing Windows features, including multi-process mode. A local example running on Windows would not resolve that support requirement.
Maintenance metadata has limits
The supplied repository metadata records the last push as October 26, 2026. A push date shows repository activity; it does not explain the access-log assertions in the measured run. The supplied metadata contains no latest-release result; it does not establish that no release exists. The measured checkout remains identified by commit 57deb98, without assigning it a release version from the stable documentation.
What to compare and try next
aiohttp supports HTTP clients and servers, including WebSockets on both sides. Evaluate it when those interfaces are your main comparison criteria. FastAPI builds Python APIs around standard Python type hints. Evaluate it when declaring API inputs with Python types is central to your application. The supplied run provides no comparative performance result for either alternative.
For a Tornado trial, keep a representative long-lived connection open while another handler performs the slowest work your application permits. This is a proposed check, not a measured result. Separately obtain the exact repository test invocation and investigate its failure. Assess service behavior and repository verification separately before deciding what to deploy.

