-
-
Notifications
You must be signed in to change notification settings - Fork 2.8k
Description
This is a proposal to deprecate the Tokio LocalSet
abstraction in favor of a new LocalRuntime
type. Currently, to spawn !Send
tasks on Tokio you must use a combination of a current-thread runtime and LocalSet
to make that work. However, tasks on a LocalSet
are separate from the rest of the runtime in an uncomfortable way. For example:
- Tasks on the
LocalSet
cantokio::spawn
to get onto the runtime, but once you're on the runtime, you can no longerspawn_local
to get back into theLocalSet
. - From the runtime's perspective, all of the tasks in the
LocalSet
behave like a single task usingFuturesUnordered
, so various runtime options such asevent_interval
behave in a very surprising way by counting many tasks as a single task. - After discussions with Deno (a while ago), use of
LocalSet
has been shown to involve considerable performance overhead compared to unsafely spawning the!Send
tasks onto a current-thread runtime.
Because of the above, I have proposed to add a new type called LocalRuntime
which will be the replacement. Please see #6739 for the feature request to add that type. However, beyond just adding a new LocalRuntime
type, I am also proposing to formally deprecate the LocalSet
type. That's this issue.
Specifically, I am proposing the following course of action:
- First, we add a
LocalRuntime
type, which would close #6739. - Then, 6 months later, we add
#[deprecated]
to theLocalSet
type, so that existing users ofLocalSet
receive a warning that recommendsLocalRuntime
. - Finally, since we are a stable 1.x crate, we keep
LocalSet
working forever.
I believe that all existing uses of LocalSet
can be replaced either by the new LocalRuntime
or by FuturesUnordered
. The advantage of this approach is that the current design of LocalSet
make it impossible to add some features without having them be really confusing:
- Issue #3181 proposes to add hooks that run when a task is spawned / destroyed. The hooks would not run for tasks on the
LocalSet
. This is confusing. - Task dumps currently don't look inside
block_on
, which means thatLocalSet
tasks are completely invisible to task dumps.
In both cases, supporting LocalSet
well is very difficult. As long as LocalSet
remains a first-class citizen, it is difficult to introduce new features that affect all tasks without having confusing behavior when LocalSet
is used.
Note that spawn_local
is not being deprecated. The intent is that it will work together with LocalRuntime
.
Some alternative options:
- Do nothing. The previously mentioned disadvantages apply.
- Add
LocalRuntime
but do not deprecateLocalSet
. This provides a way to work around the performance issues ofLocalSet
, but ultimately it is still difficult to introduce new features that affect all tasks on the runtime.
The purpose of this issue is to gather feedback from users of LocalSet
. Please post your experience below. I am especially interested in use-cases that cannot be replaced by LocalRuntime
or FuturesUnordered
.