Tokio
Tokio provides:
- A multi-threaded runtime for executing asynchronous code.
- An asynchronous version of the standard library.
- A large ecosystem of libraries.
use tokio::time;async fn count_to(count: i32) {for i in 0..count {println!("Count in task: {i}!");time::sleep(time::Duration::from_millis(5)).await;}}#[tokio::main]async fn main() {tokio::spawn(count_to(10));for i in 0..5 {println!("Main task: {i}");time::sleep(time::Duration::from_millis(5)).await;}}
With the
tokio::mainmacro we can now makemainasync.The
spawnfunction creates a new, concurrent “task”.Note:
spawntakes aFuture, you don’t call.awaitoncount_to.
Further exploration:
Why does
count_tonot (usually) get to 10? This is an example of async cancellation.tokio::spawnreturns a handle which can be awaited to wait until it finishes.Try
count_to(10).awaitinstead of spawning.Try awaiting the task returned from
tokio::spawn.