Consider removing spawning from futures::task::Context #56
Description
The Context
struct currently conflates two independent concerns: allowing futures to arrange to be notified via Waker
s, and allowing new tasks to be spawned. I don't believe these belong together. Wakeup handling is useful to practically all leaf futures that aren't serviced by kernel mechanisms (i.e. that aren't leaf I/O futures), so it makes sense to ensure these facilities are passed down to every leaf. By contrast, very few futures require the ability to spawn tasks, and those that do are typically in application code (for example, the accept loop of a server) where an executor handle can be easily made available. In the rare case where library code genuinely needs to spawn new tasks, this can be easily accomplished by explicitly taking an executor handle, or by returning an impl Stream<impl Future>
whose elements can be spawned in whatever manner is appropriate to the application.
The specifics of spawning a task can also vary considerably between executors in ways the generic interface exposed by Context
cannot support. For example, applications which require non-Send
futures or which can't perform dynamic allocation cannot make use of Context
-based spawning at all. This not only leads to awkward vestigal API surface, but also presents a subtle compatibility hazard: code using an executor that does not support spawning via Context
will compile fine when combined with libraries that assume one, but fail at runtime when spawning is attempted. By contrast, if the ecosystem standardizes on returning streams of futures, spawning (and guarantees such as Send
ability of futures to be spawned) naturally becomes explicit.
cc @carllerche, @Nemo157