Introduction to runtimes and why we need them
As you know by now, you need to bring your own runtime for driving and scheduling asynchronous tasks in Rust.
Runtimes come in many flavors, from the popular Embassy embedded runtime (https://github.com/embassy-rs/embassy), which centers more on general multitasking and can replace the need for a real-time operating system (RTOS) on many platforms, to Tokio (https://github.com/tokio-rs/tokio), which centers on non-blocking I/O on popular server and desktop operating systems.
All runtimes in Rust need to do at least two things: schedule and drive objects implementing Rust’s Future
trait to completion. Going forward in this chapter, we’ll mostly focus on runtimes for doing non-blocking I/O on popular desktop and server operating systems such as Windows, Linux, and macOS. This is also by far the most common type of runtime most programmers will encounter in Rust.
Taking control over how tasks are scheduled is very invasive...