Check out Task.yield_many/2 (https://hexdocs.pm/elixir/Task.html#yield_many/2 
<https://hexdocs.pm/elixir/Task.html#yield_many/2>) :-)

> On 31 Mar 2021, at 22:54, [email protected] <[email protected]> 
> wrote:
> 
> 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] 
> <mailto:[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
>  
> <https://groups.google.com/d/msgid/elixir-lang-core/59a5b5af-528b-4f1f-8e17-6dad9edfe9ccn%40googlegroups.com?utm_medium=email&utm_source=footer>.

-- 
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/D80D954A-6C8B-4725-8231-FF66835B6A60%40wojtekmach.pl.

Reply via email to