Runtimes, Wakers, and the Reactor-Executor Pattern 184 To give you a few examples, you could use a separate reactor for handling timers (for example, when you want a task to sleep for a given time), or you might want to implement a thread pool for handling CPU-intensive or blocking tasks as a reactor that wakes up the corresponding future when the task is ready. To solve these problems, we need a loose coupling between the reactor and executor part of the runtime by having a way to wake up the executor that's not tightly coupled to a single reactor implementation. Let's look at how we can solve this problem by creating a better runtime design. Creating a proper runtime So, if we visualize the degree of dependency between the different parts of our runtime, our current design could be described this way: Figure 8. 5-Tight coupling between reactor and executor If we want a loose coupling between the reactor and executor, we need an interface provided to signal the executor that it should wake up when an event that allows a future to progress has occurred. It's no coincidence that this type is called Waker (https://doc. rust-lang. org/stable/std/ task/struct. Waker. html ) in Rust's standard library. If we change our visualization to reflect this, it will look something like this: 