If I may reply to myself: Sometimes just stating the problem for someone else makes the solution clear.
My false assumption was that I needed something as fancy as agents or ThreadPoolExecutor. The solution was simple Just queue up the tests with a BlockingQueue, start some plain java threads with a "consume" fn. The "consume" fn does the binding, polls the queue and exits when a "done" flag is set. The done flag is set to true when the report finishes. Jeff On Aug 8, 12:59 pm, jweiss <jeffrey.m.we...@gmail.com> wrote: > I'm having some trouble figuring out what clojure concurrency tools I > can use to solve my problem. > > The application I'm trying to build is a functional test harness, like > TestNG but for clojure. It takes an input a tree of tests to run > (where child tests don't run unless the parent passed), and runs the > tests in parallel (as much as possible) on a fixed number of threads. > Each tree node contains a promise, where the test results are placed. > A report runs at the end, and naturally blocks until all the promises > are delivered. > > The problem comes where some kinds of testing require some per-thread > setup/teardown. For instance, selenium opens a browser and drives it > to run tests. Obviously you can't have multiple tests running in the > same browser at the same time. So you need multiple browsers being > driven by one thread each. Each thread has to rebind the selenium > client var to a new value. > > So to sum up, I need a thread pool, and thread-local bindings so that > clients like selenium can run multithreaded. > java.util.concurrent.Executors fail because I can't get thread-local > bindings. I haven't been able to find a way to run the entire worker > thread with a (binding ...) form, that would apparently involve > changing the implementation of the java lib, and too much of that > stuff is marked private to proxy it. > > Agents seemed like a possibility (just for use as a thread pool), but > my use-case does not seem to match. I have a single work queue, not > many. And the agents value would have to be the local bindings, which > would never change. And agents don't have any way of reporting if > they are busy or not, so they'd have to pull in their work rather than > having it sent to them. My app seems like it would be a rather gross > abuse of agents. > > Futures don't work because I need to limit the number of threads, I > can't have 500 browsers open at once. > > Can someone suggest a direction I should go? > > Thanks, > > Jeff -- 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