2020-09-30 21:12:49 +00:00
|
|
|
// The core of async is the `Future` trait, which defines some asynchronous computation
|
|
|
|
// that may eventually yield a value.
|
|
|
|
//
|
|
|
|
// For more info, see https://doc.rust-lang.org/stable/std/future/trait.Future.html
|
|
|
|
|
|
|
|
// Functions can be marked `async` to indicate that they return a type implementing `Future`.
|
|
|
|
// The function signatures below are analogous.
|
|
|
|
async fn do_work() -> String { ... }
|
|
|
|
fn do_work() -> impl Future<Output = String> { ... }
|
|
|
|
|
2020-10-15 17:29:27 +00:00
|
|
|
// To run a future, we can add a package that provides an async runtime, since Rust does
|
2020-09-30 21:12:49 +00:00
|
|
|
// not come with one in the standard library. An asynchronous runtime schedules futures
|
|
|
|
// and continuously polls them to completion. Here, we'll use tokio, a mature and
|
|
|
|
// battle-tested library.
|
|
|
|
|
|
|
|
// in Cargo.toml
|
|
|
|
tokio = { version = "0.2.22", features = ["full"] }
|
|
|
|
|
|
|
|
// Now we can spawn futures on a runtime.
|
|
|
|
fn main() {
|
|
|
|
let mut runtime = tokio::runtime::Runtime::new().unwrap();
|
|
|
|
// `block_on` will block the current thread until the given task completes
|
|
|
|
runtime.block_on(async {
|
|
|
|
// Now we're in a worker thread
|
|
|
|
// Futures can be executed using `.await`
|
|
|
|
let my_string = do_work().await;
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
// We can also use a macro to make this much more compact.
|
|
|
|
#[tokio::main]
|
|
|
|
async fn main() {
|
|
|
|
let my_string = do_work().await;
|
|
|
|
}
|
|
|
|
|
|
|
|
// See https://docs.rs/tokio for more information on tokio.
|
|
|
|
// See https://docs.rs/futures for more tools on working with futures.
|