vrod
I have another question about concurrency in Elixir I hope someone can help me understand. I have been studying the Task module. I am reading the documentation for the Task.async_stream/5 Task — Elixir v1.20.2
but I am confused by the ordered option. I think I understand what it does – if it is false then tasks a, b, and c may be returned in some different order like b, c, a.
However, I am struggling to understand these sentences: “This option is useful when you have large streams and don’t want to buffer results before they are delivered. This is also useful when you’re using the tasks for side effects.”
Is that saying that using ordered: false is useful when you have large streams? And should I use ordered: false if I am only using the task for side effects?
I think that makes sense, but I do not trust my own understanding with this yet.
Thank you for clarifying!
Trending in Questions
Other Trending Topics
Categories:
Sub Categories:
Forums
Popular Tags
- #ecto
- #liveview
- #troubleshooting
- #learning-elixir
- #deployment
- #library
- #erlang
- #testing
- #genserver
- #mix
- #absinthe
- #remote-other
- #otp
- #plug
- #how-to-question
- #macros
- #postgres
- #channels
- #elixirconf
- #exunit
- #discussion
- #code-sync
- #javascript
- #podcasts
- #onsite
- #dialyzer
- #docker
- #authentication
- #umbrella
- #full-time-contract
- #podcasts-by-brainlid
- #ecto-query
- #elixir-ls
- #blog-post
- #ai
- #phoenix_html
- #iex
- #elixirconf-us
- #graphql
- #genstage
- #websockets
- #supervisor
- #advent-of-code
- #distillery
- #processes
- #api
- #forms
- #hex
- #security
- #metaprogramming











Showing Posts 1 to 5- Show Best Posts
- Show All (oldest first)
- Show All (newest first)
gregvaughn
I don’t know why they mention side effects in the docs. Seems to me those could be sensitive to ordering. It really all depends on your algorithm whether the order of the results is important to preserve.
If you have
ordered: truebut the tasks complete in order of b, a, c, then the internal logic has to buffer the result of b, wait for a to finish, send a’s result downstream, then it sends the buffered b’s response, etc.If your algorithm can operate correctly with
ordered: falseI would recommend it, no matter the size of the stream or side-effects.John-Goff
I think it could be better worded as “when you’re using tasks only for the side effects”. The ordered key will not make side effects occur in the order of the enumerable, it’ll only affect the returned stream. Side effects will always occur when the task is processed, so if you need to rely on side effect order you should use
Enum.eachorEnum.map. As you point out, withordered: false, there’s no need to buffer the results. So the docs are saying basically if you’re going to pipeTask.async_streamintoEnum.each, you should useordered: false.josevalim
Both of your points are great, PR to the docs are appreciated.
John-Goff
I’ve never had the chance to submit a pr to the docs, this seems like a great opportunity! I’ll get on that today
John-Goff
PR submitted! Thanks for the encouragement
Update docs of Task.async_stream to talk more about side effects by John-Goff · Pull Request #10359 · elixir-lang/elixir · GitHub