mrkeyoor.com_
Wed 09 Sept 13:28 UTC
Dev Toolsevaluationupdated 09 Sept 2026

tokio review

Tokio is a Rust runtime for programs that wait on networks, timers, processes, and other input or output without blocking a thread for each job. It supplies the scheduler, operating-system event loop, sockets, channels, and timing tools that async Rust code needs to run.

trackingstars / 7d
Verdict

Our Tokio run built in 35 seconds and passed all 4,148 tests in 364 seconds, the cleanest result in this review set. Use it by default for a Rust network application unless a measured workload calls for a smaller or thread-per-core runtime. Keep CPU-heavy work off the async workers, and make libraries choose features instead of exporting full to every dependent.

We ran it

Lab card: what happened when we ran tokioScreenshot of tokio (tokio.rs)
Install✓ · 18s101 packages
Build✓ · 35s
Tests✓ · 364s4148 passed · 0 failed of 4148 (cargo test)
Repo871 files~182,677 lines of source · 6.1 MB · 7 CI workflows

Answers from our run

Does tokio build from source?

Dependencies installed in 18 seconds (101 packages), and the build succeeded in 35 seconds. We cloned commit d6bf379 into a clean Debian container with 3 CPUs and no project-specific setup.

Do tokio's tests pass?

Yes: 4148 of 4148 passed when we ran the project's own test command (cargo test). Some failures need services or credentials a bare container does not have.

Who should not use tokio?

CPU-bound programs expecting async tasks to replace a compute pool: Tokio's own crate guide recommends a separate pool such as Rayon for bounded CPU work.

What are the alternatives to tokio?

smol, async-std, Monoio. Our Tokio run built in 35 seconds and passed all 4,148 tests in 364 seconds, the cleanest result in this review set.

Setup5/5101 packages installed; build and all 4,148 tests passed
Docs5/5API, tutorial, feature, platform, MSRV, and LTS guidance is clear
Community5/533,097 stars and active September 2026 issue work
Maturity5/5Stable 1.x API, named LTS lines, and 4,148 passing tests

Who it’s for

Rust teams building network services, clients, proxies, queues, or other input/output heavy applications.
Library authors who can enable only the Tokio features their public API needs.
Projects using related crates such as Axum, Hyper, Tonic, Tower, or Tracing.
Maintainers who value a stated Rust version policy, LTS lines, and a large automated test suite.

Who it’s NOT for

CPU-bound programs expecting async tasks to replace a compute pool: Tokio's own crate guide recommends a separate pool such as Rayon for bounded CPU work.
Libraries that intend to enable Tokio's full feature for convenience: the crate docs say it pulls in extra dependencies and tell library authors to select only needed features.
Browser or WASM projects needing filesystem, networking, process, or full: Tokio documents only limited experimental WASM support, and unsupported feature combinations fail to build.
Codebases pinned below Rust 1.71: that is the current minimum supported Rust version in the README.

Setup reality

Our sandbox installed 101 packages in 18 seconds, built Tokio in 35 seconds, and completed its tests in 364 seconds. Cargo reported 4,148 passed and 0 failed out of 4,148 at commit d6bf379.

Using Tokio in an application needs a Cargo dependency and explicit feature choices; the quick example selects full. It requires no account, API credential, daemon, or external service. The documented minimum Rust version is 1.71.

Long CPU work can stall other tasks between .await points, so it belongs in spawn_blocking or a bounded compute pool. WASM support is experimental, accepts only a subset of features, and documents cases that can panic.

Tokio 1.53.1 supplies the runtime beneath async Rust

Tokio turns Rust futures into running programs. Version 1.53.1 includes a work-stealing scheduler, an event loop backed by facilities such as epoll, kqueue, and IOCP, plus asynchronous TCP and UDP sockets. Its crate modules also cover timers, processes, signals, files, channels, locks, and testing utilities.

The README points to Axum for web applications, Hyper for HTTP, Tonic for gRPC, Tower for reusable services, and Tracing for diagnostics. Tokio can therefore anchor a network stack without being the web framework or protocol implementation itself. A basic TCP server starts with the #[tokio::main] macro and an enabled set of Cargo features.

What happened when we ran it

Our sandbox installed 101 packages in 18 seconds, then built commit d6bf379 in 35 seconds. The checkout had 871 files, roughly 182,677 source lines, and occupied 6.1 MB before installation. Those figures describe work on the full repository, not the cost of adding one Tokio configuration to an application. They still show that a fresh 3-CPU Debian container could compile the checked-out workspace without a missing system library or manual repair.

The test command finished in 364 seconds with 4,148 passed and 0 failed out of 4,148. That is enough breadth to make the clean result meaningful, although it is not a benchmark of request latency or scheduler throughput. Our scan found 7 CI workflow files, no Dockerfile, and no tests directory. Tokio keeps many tests beside crate code and in other repository locations, so directory presence alone would have badly understated the suite we actually ran.

The full flag is for applications, while libraries should choose features

Tokio enables no features by default. Its full option turns on every public API except test utilities and unstable features, which is convenient while an application is taking shape. The crate documentation warns that this choice pulls extra dependencies. A library that only spawns tasks and opens TCP streams can select rt and net, keeping unrelated process, signal, filesystem, macro, and multithreaded scheduler code out of downstream builds.

No service or credential is required. Add Tokio to Cargo.toml, choose features, and supply a runtime through #[tokio::main] or runtime::Builder. The README sets Rust 1.71 as its current minimum and promises that a new minimum version will have existed for at least 6 months before adoption. Dependencies can still raise their own minimum, so applications supporting old compilers should test the resolved lockfile rather than only Tokio's declared floor.

CPU-heavy work belongs outside Tokio's core threads

Tokio's core worker count defaults to the number of CPU cores, while blocking threads are created on demand. An async task yields when it reaches .await; a long calculation between those points occupies its worker and delays unrelated tasks. The documented route for ordinary blocking work is spawn_blocking. For bounded CPU work, Tokio recommends a separate pool such as Rayon and suggests returning results through a channel.

That distinction shapes architecture more than the easy TCP example suggests. Database and HTTP waits fit the runtime. Image encoding, compression, and large calculations need explicit isolation and concurrency limits. The blocking pool permits a high upper thread count because Tokio cannot swap blocking calls the way it polls futures. A service should set limits around the workload instead of assuming 3 async workers will automatically keep an arbitrary compute queue responsive.

WASM supports 5 feature groups and rejects full

Tokio guarantees support for Linux, Windows, Android API level 21, macOS, iOS, and FreeBSD. WASM is narrower: the crate docs list sync, macros, io-util, rt, and time as the 5 feature groups that all WASM targets can build. Enabling full or another unsupported feature causes compilation to fail. Some accepted operations can still panic when the target cannot block a thread or create threads.

The project labels all WASM support experimental and allows breaking behavior changes there. Linux-only io_uring, task dumps, and scheduling-latency instrumentation also sit behind tokio_unstable, which can break within the 1.x series. Stable network services do not inherit that warning merely by using Tokio. Teams adopting an experimental facility should pin the crate and include its target-specific path in CI.

A September 2026 push and 435 open items show active maintenance

GitHub recorded the last push on September 9, 2026. The repository had 33,097 stars and 435 combined open issues and pull requests when fetched. The latest release was 1.53.1 on July 20, 2026, and its fixes covered a Windows minimum-version regression plus an unstable timer race. The README says minor releases usually arrive monthly without promising a fixed schedule, while named LTS branches receive bug fixes for at least 1 year.

Current issue traffic is detailed and technically specific. Issue #8434 reports that the unstable taskdump feature can strand children managed through FuturesUnordered; issue #8433 says an io_uring CI guest can be killed for lack of memory while its script still prints a pass message. Both concern opt-in or specialized paths, so neither overturns our 4,148-test result for the measured command. They do show maintainers examining failures beyond the ordinary stable configuration.

Smol is smaller, and Monoio targets a different Linux design

Smol is the credible first comparison for teams that want a compact set of async crates. Async-std presents APIs patterned after Rust's standard library. Monoio is for a more specific choice: Linux io_uring with a thread-per-core model. Switching runtimes affects libraries, executors, I/O types, observability, and team knowledge, so a lower dependency count alone is a weak reason to move an established Tokio service.

Tokio is the sensible default for a new Rust network service because its stable path is documented, widely connected, and clean in our run. The decision changes for a compute-first program, a WASM application needing unavailable APIs, or a team with evidence that another scheduler fits its load. For everyone else, select only the features you need, isolate blocking work, and use an LTS line when fixed-minor maintenance matters.

Alternatives

ProjectWhat it isPick it when
smolA compact async runtime that composes several small Rust crates.pick this instead when a smaller runtime surface matters more than Tokio's ecosystem and platform policy.
async-stdAn async runtime whose API is shaped to resemble Rust's standard library.pick this instead when your team prefers the standard-library-style API and its ecosystem fits the application.
MonoioA thread-per-core Rust runtime built around io_uring on supported Linux systems.pick this instead when Linux io_uring and a thread-per-core design are explicit requirements.

What people are saying

  1. [velocity-scout] tokio-rs/tokio
  2. [github-trending] tokio-rs/axum
  3. [github-trending] tokio-rs/topcoat

Sources

  1. Tokio GitHub repository and README
  2. Tokio crate documentation
  3. Tokio tutorial
  4. Tokio v1.53.1 release notes
  5. Issue 8434: taskdump trace_leaf can strand child futures
  6. Issue 8433: io_uring CI can miss killed test binaries

More dev tools reviews

chezmoi · iced · Files · linux · lerna · system-design-notes · the whole board →