Also, 'doall' is a bad idea if the number of threads is large :-).

You might want more control over the threadpool at that point.  Futures
uses
http://docs.oracle.com/javase/6/docs/api/java/util/concurrent/Executors.html#newCachedThreadPool()

https://github.com/clojure/clojure/blob/master/src/clj/clojure/core.clj#L6417
clojure.lang.Agent/soloExecutor
https://github.com/clojure/clojure/blob/master/src/jvm/clojure/lang/Agent.java#L53

Notice that IFn (any clojure function) implements callable/runnable:
https://github.com/clojure/clojure/blob/master/src/jvm/clojure/lang/IFn.java#L23

Which is what executors need.


On Sat, Apr 12, 2014 at 11:19 AM, Gary Trakhman <gary.trakh...@gmail.com>wrote:

> I'd recommend running a doall on concurrent-list in order to realize the
> futures, if you simply deref as you are, then you're going to delay the
> execution of futures down the line as the sequence is realized bit by bit
> (except chunking helps you here by accident).  You are effectively
> preventing later parts from getting realized until the earlier futures
> return.
>
> But of course, there's likely a better approach, we'd need to know what
> you're trying to do to address it.
>
> My first thoughts:
> reducers?
> executors?
> core.async?
>
> You're not actually using the value returned from the future here, so it's
> really a mild abuse of future just to get at the underlying thread-pool and
> binding-conveyance (if you need it).  You could use a lower-level
> abstraction like executors or other things to have more control.
>
>
> On Sat, Apr 12, 2014 at 7:52 AM, Cecil Westerhof 
> <cldwester...@gmail.com>wrote:
>
>> I first had the following function:
>>     (defn check-concurrent2 []
>>       (init "concurrent2")
>>       (let [c1 (future (do-sequential 1 check-until 4))
>>            c2 (future (do-sequential 2 check-until 4))
>>            c3 (future (do-sequential 3 check-until 4))
>>            c4 (future (do-sequential 4 check-until 4))]
>>            @c1 @c2 @c3 @c4)
>>       (deinit @max-factor))
>>
>> But I did not like it, because it is ‘difficult’ to change. So I changed
>> it to:
>>     (defn check-concurrent3 [number]
>>       (init (format "concurrent3 with %d threads" number))
>>       (let [concurrent-list (for [i (range 1 (+ number 1))]
>>                                  (future (do-sequential i check-until
>> number)))]
>>            (doseq [this-thread concurrent-list]
>>                   @this-thread))
>>       (deinit @max-factor))
>>
>> Is a little bit clearer and also allows me to do the following:
>>     (def threads     '(4 6 8 10))
>>
>>     (doseq [number threads]
>>            (check-concurrent3 number))
>>
>> Is this the right way to do things, or is there a better way?
>>
>> --
>> Cecil Westerhof
>>
>> --
>> 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.
>>
>
>

-- 
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.

Reply via email to