If you are just visiting every node as a tree, and you have core.async,
then there's

(let [c (chan)]
  (go
    (doseq [n (tree-seq ... (depends on tree implementation) ...)]
      (>! c n)))
  (dotimes [_ (.availableProcessors (Runtime/getRuntime))]
    (go
      (loop []
        (when-let [n (<! c)]
          (expensive-visitation n)
          (recur))))))

unless there's some trickiness with core.async that I've not "gotten" here.
Of course, if expensive-visitation returns something instead of having side
effects, you'll need to accumulate some sort of a result in each loop, and
combine these afterward (the dotimes likely becoming a for).

If the visitation is really expensive, then converting the output of
tree-seq into a vector and using reducers or pmap might also parallelize
things significantly.

If you need to do more than just visit each node -- if the tree structure
around the node and not just some value in the node needs to be considered
-- then it gets complicated. Something that traverses the tree, but spawns
new threads at each branching (up to some limit perhaps), seems indicated.



On Thu, Nov 7, 2013 at 6:23 PM, Timothy Washington <twash...@gmail.com>wrote:

> Umm I can't think of parallel dependency tree walking algos, off the top
> of my head. Sorry :/
>
> But niiice. Yeah, we're definitely thinking along the same lines. But
> you're way ahead of me. Now just to be able to isolate that browser repl on
> a per project basis.
>
>
> Sweet
>
> Tim Washington
> Interruptsoftware.ca <http://interruptsoftware.ca/> / 
> Bkeeping.com<http://bkeeping.com/>
>
>
>
> On Wed, Nov 6, 2013 at 8:46 PM, Malcolm Sparks <malc...@juxt.pro> wrote:
>
>> Hi Tim,
>>
>> It's interesting you're thinking about browser-connected repls. Today I
>> added clojurescript support to Jig, it's pushed to master but I haven't
>> documented the config options yet, but below is an example. Nothing fancy
>> like crossovers yet, it's basically a thin wrapper over ClojureScript's
>> compiler, the config options map directly to the options given to the
>> compiler.
>>
>>   :cljs-builder
>>   {:jig/component jig.cljs/Builder
>>    :jig/project "../my-proj/project.clj"
>>    :source-path "../my-proj/src-cljs"
>>    :output-dir "../my-proj/target/js"
>>    :output-to "../my-proj/target/js/main.js"
>>    :source-map "../my-proj/target/js/main.js.map"
>>    :optimizations :simple
>>    :pretty-print true
>> ;;   :clean-build true
>>    }
>>
>> Another built-in component can figure out, given the dependencies, what
>> files to serve and on which server to serve it from.
>>
>>   :cljs-server
>>   {:jig/component jig.cljs/FileServer
>>    :jig/dependencies [:cljs-builder :web]
>>    :jig.web/context "/js"
>>    }
>>
>> which depends on some Ring or Pedestal routing and Jetty or other
>> webserver, but you're likely to have that configured already :-
>>
>>
>>   :server
>>   {:jig/component jig.web.server/Component
>>    :io.pedestal.service.http/port 8000
>>    :io.pedestal.service.http/type :jetty
>>    }
>>
>>   :web
>>
>>   {:jig/component jig.web.app/Component
>>    :jig/dependencies [:server]
>>    :jig/scheme :http
>>    :jig/hostname "localhost"
>>    :jig.web/server :server
>>    }
>>
>> That's it really. I think Jig makes an ideal platform for building and
>> serving clojurescript, in comparison to Leiningen plugins. Firstly, there's
>> no JVM start-up cost, the point of Jig is to keep the JVM running all the
>> time, so there's no need for the once/auto service that lein-cljsbuild
>> offers. Secondly, serving the resulting Javascript files is straight
>> forward, and built in, so no 'lein ring server' requirement either.. With
>> Leiningen, you either have to build routes to the javascript into your own
>> app, or run lein ring server, but then Leiningen doesn't make it easy to
>> run multiple services concurrently. Thirdly, there's no file-system
>> polling, and services that depend on the clojurescript compilation can be
>> started as soon as the compilation is complete.
>>
>> One thing that lein-cljsbuild does really well is multiple build configs.
>> I've decided to use a single build configuration, to keep implementation
>> easier and a direct mapping to the clojurescript compiler, but of course
>> you can add different builds by just adding (differently configured)
>> components to the Jig config. This would benefit from being able to
>> initialize and start components in parallel, where possible. Unlike
>> cljsbuild, Jig components are started serially, in reverse dependency
>> order. Does anyone know of existing algorithms that can walk a dependency
>> tree in parallel?
>>
>> Feel free to take Jig in different directions though, I'm just letting
>> you know my current thoughts. The single REPL to multiple projects idea
>> might have to be rethought - it seems the prevailing wind is in the
>> direction of multiple REPL connections per editor/IDE.
>>
>>
>> On Thursday, 7 November 2013 01:09:53 UTC, frye wrote:
>>
>>> Too right.
>>>
>>> Yes, wrt the multi-project / classpath thing, running isolated test for
>>> a particular project is only one aspect. I also have an eye to running a i)
>>> browser-connected repl and ii) debugger for a particular project. So those
>>> things, along with iii) running tests, make very high, the attractiveness
>>> of having that isolation.
>>>
>>> I'll try to put those in github issues. And also pick at the problem
>>> myself when I get some cycles. I think it would add a powerful feature to
>>> the tool. Anyways... :)
>>>
>>>
>>> Tim Washington
>>> Interruptsoftware.ca <http://interruptsoftware.ca/> / 
>>> Bkeeping.com<http://bkeeping.com/>
>>>
>>>
>>  --
> --
> 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/groups/opt_out.
>

-- 
-- 
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/groups/opt_out.

Reply via email to