-
Notifications
You must be signed in to change notification settings - Fork 3.5k
Description
Elixir tasks makes it really straight-forward for developers to execute chunks of code concurrently. This is usually done with Task.async/1
:
Task.async(fn ->
...
end) |> Task.await()
However, in practice, developers should prefer to use Task.Supervisor.async
, as the supervision tree gives more visibility over spawned tasks:
Task.Supervisor.async(MySup, fn ->
...
end) |> Task.await()
Unfortunately, moving to Task.Supervisor
has one big downside: we lose the relationship between the process who started the task and the task itself. That's because in the first example, the parent of the task is the caller process, but in the second example, the parent is the supervisor.
This means instrumentation/monitoring/logging tools and even testing tools like Mox and the Ecto's SQL Sandbox are incapable of detecting the relationship between them.
I propose that we add a new field to the Task process dictionary, called $callers
, that tracks exactly the caller of the task. This will allow tools to properly build the relationship between processes and allow testing tools that rely on ownership mechanisms to propagate those effectively without requiring tests to run synchronously.