Article · Wikipedia archive · Last revised Jun 13, 2026

Tokio (software)

Tokio is a software library for the Rust programming language. It provides a runtime and functions that enable the use of asynchronous I/O, allowing for concurrency in regards to task completion.

Last revised
Jun 13, 2026
Read time
≈ 6 min
Length
1,265 w
Citations
29
Source
Tokio
Original authorCarl Lerche
Initial releaseDecember 23, 2020 (2020-12-23)
Stable release
1.52.31 Edit this on Wikidata
Written inRust
Operating systemWindows, Linux, macOS, FreeBSD, WebAssembly
TypeAsynchronous runtime
LicenseMIT License
Websitetokio.rs
Repository

Tokio is a software library for the Rust programming language. It provides a runtime and functions that enable the use of asynchronous I/O, allowing for concurrency in regards to task completion.234

Tokio was released in August 2016 for Rust, a general-purpose programming language. Developed by Carl Lerche, Tokio began as a network application framework and supports features such as socket listening and broadcasting, allowing messages to be transferred between computers.

History

Tokio began in August 2016 by Carl Lerche as a network application framework for Rust built on futures, allowing for network-based middleware and a non-blocking, or asynchronous, implementation of readiness interest to the reactor. Tokio was inspired by Finagle, a Scala-based asynchronous remote procedure call (RPC) system developed at Twitter for Java virtual machines (JVM), allowing distributed systems to communicate within a JVM. Tokio utilizes the lower-level Rust crate mio, itself using system calls such as epoll (Linux), kqueue (FreeBSD), and the input/output completion port (IOCP) API (Windows). For Linux it can also use io_uring via tokio-uring.567 The name "Tokio" is derived from Tokyo and mio, and the Tokio logo vaguely resembles the city emblem of Tokyo.8 The preliminary version of Tokio was released in January 2017,9 followed by a full release in December 2020.1011 In 2017, Tokio received a grant from the Mozilla Open Source Support fund.12 In April 2021, Tokio funded its first paid contributor, Alice Ryhl, for her work both developing the project and assisting its users.1314

While Rust has supported asynchronous functions since version 1.39, released in November 2019,15 it provides no facilities to execute them, requiring an external runtime for that purpose.16 Tokio provides a runtime that uses a multi-threaded work stealing scheduler.10 Rust's futures are lazily evaluated, requiring functions to call .await before they do any work.17 When .await is invoked, Tokio's runtime may pause the original future until its I/O completes, and unpauses a different task that is ready for further processing.18

Users of Tokio include the development teams behind Discord and AWS Lambda.10 The JavaScript and TypeScript runtime Deno uses Tokio under the hood, in comparison to the JavaScript runtime Node.js, which uses the libuv library.19

Features

Runtime

Tokio allows for the execution of asynchronous functions in Rust through its built-in runtime, which may be initialized via the #[tokio::main] macro.18 For example:

use std::error::Error;

#[tokio::main]
async fn main() -> Result<(), Box<dyn Error>> {
    let url = "https://en.wikipedia.org/";
    let text = reqwest::get(url).await?.text().await?;
    println!("{}", text);
    Ok(())
}

Here, the reqwest crate is used to request the HyperText Markup Language (HTML) for English Wikipedia. After reqwest::get is called to initialize the asynchronous request, .await will hand over control to the runtime, which then drives all the I/O operations of the request to completion before resuming the main function after the .await.

A simple example of a TCP echo server is as follows:

use std::error::Error;
use tokio::io::{AsyncBufReadExt, AsyncWriteExt, BufReader};
use tokio::net::TcpListener;

#[tokio::main]
async fn main() -> Result<(), Box<dyn Error>> {
    // Run a server on port 8080.
    let listener = TcpListener::bind("localhost:8080").await?;

    loop {
        // Wait for a new connection from a client.
        let (mut stream, _remote_addr) = listener.accept().await?;

        // Spawn a new asynchronous task to handle the connection.
        tokio::spawn(async move {
            let (reader, mut writer) = stream.split();
            let mut reader = BufReader::new(reader);

            // While there is data to be read from the stream…
            while !reader.fill_buf().await.unwrap().is_empty() {
                // Write the data back.
                writer.write_all(reader.buffer()).await.unwrap();
            }
        });
    }
}

This code makes use of the tokio::spawn function to create an asynchronous task (implemented as a stackless coroutine), allowing each connection to be handled separately in the same process, as the runtime ensures that tasks run in the background automatically.20 Importantly however, the runtime multiplexes the tasks’ execution on a single thread pool (whose size is by default equal to the number of processors on the system), and so in comparison to the approach of spawning a separate thread for each task, fewer resources are consumed.

Asynchronous I/O and timers

Tokio provides several I/O and timing primitives that work natively inside its runtime. The TcpListener structure used above contains a Transmission Control Protocol (TCP) socket listener that is registered with the runtime, allowing it to be used asynchronously; similarly, the tokio::time::sleep function can be used to suspend a task's execution for a certain duration of time, and again this is implemented by registration with the runtime.21

Synchronization primitives

Tokio also provides several generic synchronization primitives suitable for use in an asynchronous context, including locks, semaphores, barriers and channels.22 Unlike the I/O and timer primitives, these work even outside of the runtime context.23

Blocking thread pool

To facilitate interopability with traditional synchronous code, Tokio provides as part of its runtime a thread pool on which synchronous I/O operations may run.24 In particular, tokio::task::spawn_blocking creates a task which runs in this pool, and is allowed to perform blocking operations—this is unlike tokio::spawn, which may only run asynchronous code.25 For example, this is used to implement filesystem operations, as many platforms do not provide native asynchronous filesystem APIs (an exception to this is Linux's io_uring, however support for this exists only in the external tokio_uring library and is not yet built in).26

References

References

  1. "Release 1.52.3". 8 May 2026. Retrieved 12 May 2026.
  2. Chanda, Abhishek (2018). Network Programming with Rust: Build fast and resilient network servers and clients by leveraging Rust's memory-safety and concurrency features. Birmingham: Packt Publishing. ISBN 978-1-78862-171-7. OCLC 1028194311.
  3. Sharma, Rahul (2019). Mastering Rust : learn about memory safety, type system, concurrency, and the new features of Rust 2018 edition. Vesa Kaihlavirta (Second ed.). Birmingham, UK. ISBN 978-1-78934-118-8. OCLC 1090681119.{{cite book}}: CS1 maint: location missing publisher (link)
  4. De Simone, Sergio (2021-01-06). "Rust Asynchronous Runtime Tokio Reaches 1.0". InfoQ. Retrieved 2021-11-21.
  5. Lerche, Carl (August 3, 2016). "Announcing Tokio". Retrieved December 11, 2022.
  6. "Finagle: A Protocol-Agnostic RPC System". August 19, 2011. Retrieved December 11, 2022.
  7. Gomez, Guillaume; Boucher, Antoni (2018). Rust Programming By Example: Enter the World of Rust by Building Engaging, Concurrent, Reactive, and Robust Applications. Birmingham: Packt Publishing. ISBN 9781788470308.
  8. Lerche, Carl (August 3, 2016). "I enjoyed visiting Tokio (Tokyo) the city and I liked the "io" suffix and how it plays w/ Mio as well. I don't know... naming is hard so I didn't spend too much time thinking about it". Reddit. Retrieved December 11, 2022.
  9. Lerche, Carl; Crichton, Alex; Turon, Aaron. "Announcing Tokio 0.1". Retrieved December 11, 2022.
  10. Krill, Paul (2021-01-08). "Tokio Rust runtime reaches 1.0 status". InfoWorld. Retrieved 2021-09-03.
  11. Lerche, Carl. "Announcing Tokio 1.0". Retrieved December 11, 2022.
  12. "Mozilla Awards $365,000 to Open Source Projects as part of MOSS". LWN.net. Retrieved 2021-11-21.
  13. "Welcoming Alice Ryhl as the first paid Tokio contributor". Tokio. Retrieved 2021-11-28.
  14. Allen Wyma (12 November 2021). "Tokio Ecosystem with Alice Ryhl". Rustacean Station (Podcast). Retrieved 2021-11-26.
  15. "Rust Gets Zero-Cost Async/Await Support in Rust 1.39". InfoQ. Retrieved 2021-11-28.
  16. "The Async Ecosystem". Asynchronous Programming in Rust. Retrieved 2021-11-28.
  17. Matsakis, Niko (2019-11-07). "Async-await on stable Rust!". Rust Blog. Retrieved 2021-11-28.
  18. "Hello Tokio". Tokio. Retrieved 2021-11-28.
  19. Rappl Moraza, Florian (2022). Modern Frontend Development with Node.js: A Compendium for Modern JavaScript Web Development Within the Node.js Ecosystem. Birmingham, UK. ISBN 9781804617380.{{cite book}}: CS1 maint: location missing publisher (link)
  20. Tokio Contributors (2025-07-04). "Module task". Retrieved 2025-07-18.
  21. Lerche, Carl (2018-03-30). "New Timer implementation". Retrieved 2025-07-18.
  22. Tokio Contributors (2025-07-04). "Module sync". Retrieved 2025-07-18.
  23. Lerche, Carl (2020-04-01). "Reducing tail latencies with automatic cooperative task yielding". Retrieved 2025-07-18.
  24. Tokio Contributors (2025-07-04). "Function spawn_blocking". Retrieved 2025-07-18.
  25. Ryhl, Alice (2020-12-21). "Async: What is blocking?". Retrieved 2025-07-18.
  26. Tokio Contributors (2025-07-04). "Module fs". Retrieved 2025-07-18.
External links