Expand description

A batteries included runtime for applications using Tokio.

Applications using Tokio require some runtime support in order to work:

  • A reactor to drive I/O resources.
  • An executor to execute tasks that use these I/O resources.
  • A timer for scheduling work to run after a set period of time.

While it is possible to setup each component manually, this involves a bunch of boilerplate.

Runtime bundles all of these various runtime components into a single handle that can be started and shutdown together, eliminating the necessary boilerplate to run a Tokio application.

Most applications wont need to use Runtime directly. Instead, they will use the run function, which uses Runtime under the hood.

Creating a Runtime does the following:

  • Spawn a background thread running a Reactor instance.
  • Start a ThreadPool for executing futures.
  • Run an instance of Timer per thread pool worker thread.

The thread pool uses a work-stealing strategy and is configured to start a worker thread for each CPU core available on the system. This tends to be the ideal setup for Tokio applications.

A timer per thread pool worker thread is used to minimize the amount of synchronization that is required for working with the timer.

Usage

Most applications will use the run function. This takes a future to “seed” the application, blocking the thread until the runtime becomes idle.

use tokio::net::TcpListener;

let listener = TcpListener::bind(&addr).unwrap();

let server = listener.incoming()
    .map_err(|e| println!("error = {:?}", e))
    .for_each(|socket| {
        tokio::spawn(process(socket))
    });

tokio::run(server);

In this function, the run function blocks until the runtime becomes idle. See shutdown_on_idle for more shutdown details.

From within the context of the runtime, additional tasks are spawned using the tokio::spawn function. Futures spawned using this function will be executed on the same thread pool used by the Runtime.

A Runtime instance can also be used directly.

use tokio::runtime::Runtime;
use tokio::net::TcpListener;

let listener = TcpListener::bind(&addr).unwrap();

let server = listener.incoming()
    .map_err(|e| println!("error = {:?}", e))
    .for_each(|socket| {
        tokio::spawn(process(socket))
    });

// Create the runtime
let mut rt = Runtime::new().unwrap();

// Spawn the server task
rt.spawn(server);

// Wait until the runtime becomes idle and shut it down.
rt.shutdown_on_idle()
    .wait().unwrap();

Modules

A runtime implementation that runs everything on the current thread.

Structs

Builds Tokio Runtime with custom configuration values.

Handle to the Tokio runtime.

A future that resolves when the Tokio Runtime is shut down.

Executes futures on the runtime

Functions

Start the Tokio runtime using the supplied future to bootstrap execution.