Creating Your Own Runtime 264 Okay, so now everything works as expected. The only difference is that we get woken up a few extra times, but the program finishes and produces the expected result. Before we discuss what we just witnessed, let's do one more experiment. Isahc is an HTTP client library that promises to be executor agnostic, meaning that it doesn't rely on any specific executor. Let's put that to the test. First, we add a dependency on isahc by typing the following: cargo add isahc@1. 7 Then, we rewrite our main function so it looks like this: ch10/b-rust-futures-examples/src/main. rs (async_main3) use isahc::prelude::*; async fn async_main() { println!("Program starting"); let url = "http://127. 0. 0. 1:8080/600/Hello Async Await1"; let mut res = isahc::get_async(url). await. unwrap(); let txt = res. text(). await. unwrap(); println!("{txt}"); let url = "http://127. 0. 0. 1:8080/400/Hello Async Await2"; let mut res = isahc::get_async(url). await. unwrap(); let txt = res. text(). await. unwrap(); println!("{txt}"); } Now, if we run our program by writing cargo run, we get the following output: Program starting main: 1 pending tasks. Sleep until notified. main: 1 pending tasks. Sleep until notified. main: 1 pending tasks. Sleep until notified. Hello Async Await1 main: 1 pending tasks. Sleep until notified. main: 1 pending tasks. Sleep until notified. main: 1 pending tasks. Sleep until notified. Hello Async Await2 main: All tasks are finished So, we get the expected output without having to jump through any hoops.