In general, no. For example, Tokio supports creating runtime via Builder::new_current_thread, which, as the name suggests, will run all tasks on the thread it is created on (and does not require them to be Send, as a consequence).
Be aware that new_current_thread also requires tasks to be Send. The way to use non-Send tasks in Tokio us to use a LocalSet. The difference is that a Runtime object can be moved from one thread to another, but a LocalSet can't.
@Cerber-Ursi@alice : Cool; thanks. I guess the high level bit here is that my original assumption was wrong: 1. async does not imply multi thread and 2. tokio already has async-pinned-on-a-thread runtimes.