We’ve been watching Timothy Baldridge’s great O’Reilly video series on core.async, but are perplexed by one of the examples. In lecture 14 on tuning back-pressure, he introduces a function map-pipe for giving a channel a pipeline of work to do, and then as the final step, adds the ability to add a level of parallelism. (Later in the series we find out that there are more sophisticated tools along these lines already built in to core.async, but this example is still interesting.)
I can’t figure out how one aspect of it works, however. Here is the simple function: (defn map-pipe ([in out f] (map-pipe 0 in out f)) ([p in out f] (dotimes [_ p] (go (loop [] (when-some [v (<! in)] (>! out (f v)) (recur))) (close! out))))) The idea being that you can supply a level of parallelism by passing in a value for p which is greater than 1, and the dotimes will spin up that many go blocks working on the channel in parallel. My concern was this: Since the close! happens asynchronously on one of those parallel go blocks, surely the first instance which finds that in has closed can call (close! out) while the other instances are still working on their last task. Won’t they then be unable to write their results to the now-closed channel? Or is there some subtlety that none of us could figure out which prevents this from being an issue? In writing up this question, though, I noticed another issue. The three-argument arity of map-pipe should surely call the four-argument version with a p value of 1, not 0, or nothing will ever get processed, right? In fact that is what he says while he is editing the code, but ends up typing a zero rather than a one. So I am thinking this may have just been a quick example that ended up slightly wrong; it is one of the few cases in the video series where the code is not run as it is written, so it might have just been missed. But I worry that it is our understanding that is incorrect, not the example, so I would appreciate some independent confirmation or correction. Cheers, -James -- You received this message because you are subscribed to the Google Groups "Clojure" group. To post to this group, send email to clojure@googlegroups.com Note that posts from new members are moderated - please be patient with your first post. To unsubscribe from this group, send email to clojure+unsubscr...@googlegroups.com 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 clojure+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout.