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 1..=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 1..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.