Proposal: Easy, Pipe-friendly Task.Supervisor

64 views
Skip to first unread message

Jayson Vantuyl

unread,
May 24, 2022, 8:26:46 PM5/24/22
to elixir-l...@googlegroups.com
Problem:

Currently, using Task.Supervisor requires putting the supervisor name itself as the first parameter for most of the API functions.

This makes it difficult to pipe into it or use it in Enum.map/2 without using sometimes confusing function captures.

Mostly, this makes the async_stream_* functions fairly unintuitive. It’s most useful in streaming pipelines but can’t be used in them easily without wrapper functions.

Proposal:

Use a “using” pattern similar to the one used in GenServer or even Task itself to make it easy to create “wrapper supervisors”.

Something like this…
defmodule MyTaskSupervisor do
  use Task.Supervisor
end

MyTaskSupervisor.start_link()

list_stale_files()
|> MyTaskSupervisor.async_stream_nolink(&File.rm/1)
|> log_results()

Considerations:

It would probably be useful to accept options for the “using” macro.  At least the options to Task.Supervisor.start_link would be useful.

We could also implement a set_dynamic_task_supervisor in the style of Ecto’s set_dynamic_repo. This would be most important for testing, where being able to run many of these in parallel would be helpful.

Jayson Vantuyl

Reply all
Reply to author
Forward
0 new messages