Hi,
what is the most idiomatic way to return a single value from an async
function in Clojure?
A: return a channel which conveys the result later; also closes the channel
(defn f [x]
(let [c (chan)]
; put result onto c and close c later
c))
B: take a channel onto which the result is put later; do not close that
channel; return nil immediately
(defn f [x c]
; put result onto and close c later
nil)
Variant A has the advantage that it needs one function argument less than
variant B. It's also better usable in higher order functions like map.
Variant A is also more easy to use if you need to create a channel anyway.
Variant A has the disadvantage of creating a new channel each time the
async function is called. According my measurements using criterium 0.4.3,
clojure
1.6.0 and core.async 0.1.346.0-17112a-alpha, the runtime cost of creating a
channel is about 8 times more expensive as creating a single object.
Variant B has the advantage to not create a channel on every call. You can
supply the same channel many times to the function. On the other hand, the
results of multiple calls to f are not likely to arrive on that single
channel in call order. If you have such an ordering requirement, you have
to create a single channel for each function call anyway.
Variant B has the disadvantage that it requires one function argument more
than variant A. As a consequence, you can't simply map such a function over
a list of inputs.
Variant A seems to be the winner. But I ask specially because pipeline-async
<https://clojure.github.io/core.async/#clojure.core.async/pipeline-async> uses
variant B.
What do you think?
Alex
--
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to [email protected]
Note that posts from new members are moderated - please be patient with your
first post.
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en
---
You received this message because you are subscribed to the Google Groups
"Clojure" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
For more options, visit https://groups.google.com/d/optout.