*Proposal*
Add a function to the Task module that takes a list of tasks, and returns
as soon as one of the tasks finishes, shuting down the other tasks.
The behaviour would pretty similar to what Javascript have with Promise.any
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/any
*Motivation*
One scenario that it could be useful is when we are integrating with
multiple APIs (providers) of the same data, and we want only the fastest
result without needing to wait for the other requests to complete.
Today I think this could be implemented with something similar to the
following code:
tasks = [
Task.async(&heavy_fun_1/0),
Task.async(&heavy_fun_2/0),
Task.async(&heavy_fun_3/0)
]
receive do
{ref, result} ->
tasks
|> Enum.reject(fn task -> task.ref == ref end)
|> Enum.each(&Task.shutdown/1)
result
after
5000 ->
{:error, :timeout}
end
However that seems to be a common enough pattern to add to the standard
library.
*Questions*
- Am I missing something here and this could already be easily accomplished
with the existing API?
- What should be the behaviour when the first task to complete exits?
--
You received this message because you are subscribed to the Google Groups
"elixir-lang-core" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To view this discussion on the web visit
https://groups.google.com/d/msgid/elixir-lang-core/59a5b5af-528b-4f1f-8e17-6dad9edfe9ccn%40googlegroups.com.