The thing to remember is map is lazy, so you are lazily (on demand)
creating a bunch of futures. Then doseq walks through those futures,
demanding one at a time. You deref the future immediately after doseq
requested it from the lazy-seq and are blocking on its completion then
doseq can move on to demanding the next future be created.
This effectively creates a future and then waits on its completion
before creating the next future. So you end up with everything happening
in sequence.
On 04/08/2016 10:38 PM, Chris White wrote:
> Spoiler alert: I'm really really new to this language so don't expect
> quality code
>
> In an attempt to see how futures work I'm trying to make code that does
> the following:
>
> 1. Take a list of sites
> 2. Loop through the sites and retrieve the HEAD content via a future
> for each individual site
> 3. In the main loop once the futures have been created print the HEAD
> content as each future completes
>
> Now I have this code which I'm getting stuck at:
>
>
> (ns cjr-http-test.core
> (:require [clj-http.client :as client]))
>
> (defn get-head-response-for-sites
> [sites]
> (map (fn [site] (future (client/head site))) sites))
>
> (doseq [head-data (get-head-response-for-sites '("http://www.google.com"
> "http://www.yahoo.com" "http://www.bing.com"))]
> (println (deref head-data)))
>
> (shutdown-agents)
>
>
> (Please note I know that the list of sites I'd normally expect to be
> something from a DB/text file. I'm just trying to get it working without
> adding extra things to think about)
>
>
> So get-head-response-for-sites is where I'm trying to do #2. It gets me
> a list of futures that I can use. Where I'm having trouble is that the
> current println line, which is where I'm trying to deal with #3, blocks
> due to deref-ing so it's basically not really all that different than if
> I did it non threading.
>
> What I (think) I need is something that keeps looping through all the
> futures, checking their status, and println’ing the result when
> something has come back. This will be repeated until all the futures are
> done. The reason I want this is that for example if the first site takes
> 3 minutes to respond I want the other two sites to print their HEAD
> content as soon as it’s retrieved. Here's what I'm trying to figure out
> in order of importance:
>
> 1. How do I get a constant loop through the futures, println'ing the
> HEAD content as they finish, until all futures are finished?
> 2. Is there a better way to structure this?
> 3. Is there something in Clojure/contrib that's better suited for this?
> 4. Is there a 3rd party library better suited for this?
>
> Thanks for any and all response. Once again I apologize for the not so
> pro code but some code is better than nothing I hope.
>
>
> - Chris White ( @cwgem )
>
> --
> 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]
> <mailto:[email protected]>.
> For more options, visit https://groups.google.com/d/optout.
--
And what is good, Phaedrus,
And what is not good—
Need we ask anyone to tell us these things?
--
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.