8 releases

Uses new Rust 2024

0.1.4 Jan 30, 2026
0.1.3 Jan 29, 2026
0.0.2 Aug 13, 2025
0.0.1 Nov 24, 2024
0.0.0 Oct 24, 2024

#589 in Asynchronous

49 downloads per month
Used in 2 crates

Apache-2.0

270KB
5.5K SLoC

Documentation Crates.io CI License: Apache-2.0

Nio

Nio is a Thread-Per-Core async runtime for Rust.

Task spawning APIs

Nio uses multiple worker threads to execute tasks.

Function Send requirement Thread affinity
nio::spawn_local !Send allowed Pinned to current thread
nio::spawn_pinned Only captured variables Pinned to one worker thread (selected by the runtime based on load)
nio::spawn_pinned_at Only captured variables Pinned to a specific worker thread (by index)
nio::spawn Send required Not pinned, may move between threads at .await points

Note: nio::spawn_pinned, nio::spawn_pinned_at accept async closure, Only captured variables required to be Send, task itself is !Send.

Example

[dependencies]
nio = { version = "0.1.3", features = ["tokio-io"] }

By default, Nio implements async traits from futures-io. But the optional "tokio-io" feature implements async traits from tokio::io.

Here is a basic echo server example:

use futures::AsyncWriteExt;
use nio::net::TcpListener;
use std::io::Result;

#[nio::main]
async fn main() -> Result<()> {
    let mut listener = TcpListener::bind("127.0.0.1:8080").await?;
    println!("{listener:#?}");

    loop {
        let conn = listener.accept().await?;
        println!("[INCOMING] {:?}", conn.peer_addr());

        let accept = || async {
            // Accept the connection on different worker thread
            let mut stream = conn.connect().await?;
            let mut buf = vec![0; 1024];
            while let Ok(n) = stream.read(&mut buf).await {
                if n == 0 {
                    break;
                }
                stream.write_all(&buf[..n]).await.unwrap();
            }
            Result::Ok(())
        };
        nio::spawn_pinned(accept);
    }
}

Dependencies

~0.5–3.5MB
~61K SLoC