Da http://martintrojer.github.io/clojure/2013/07/07/coreasync-and-blocking-io/:blocco Go vs thread nel core.async
Per ottenere un po 'più concreto vediamo cosa succede quando cerchiamo di emettere qualche richiesta GET HTTP usando core.async. Iniziamo con la soluzione ingenua , utilizzando l'IO di blocco tramite clj-http.
(defn blocking-get [url] (clj-http.client/get url)) (time (def data (let [c (chan) res (atom [])] ;; fetch em all (doseq [i (range 10 100)] (go (>! c (blocking-get (format "http://fssnip.net/%d" i))))) ;; gather results (doseq [_ (range 10 100)] (swap! res conj (<!! c))) @res )))
Qui stiamo cercando di recuperare 90 frammenti di codice (in parallelo) utilizzando andare blocchi (e bloccando IO). Questo ha richiesto molto tempo, e questo perché i thread del blocco go sono "bloccati" dalle operazioni di I/O con esecuzione lunga. La situazione può essere migliorata passando i blocchi go ai normali thread .
(time (def data-thread (let [c (chan) res (atom [])] ;; fetch em all (doseq [i (range 10 100)] (thread (>!! c (blocking-get (format "http://fssnip.net/%d" i))))) ;; gather results (doseq [_ (range 10 100)] (swap! res conj (<!! c))) @res )))
Che cosa significa che "vanno discussioni blocco sono accaparrati dai lunghi in esecuzione operazioni di IO"?
Anche se il clojure userebbe ForkJoin ma sembra che non lo sia. Usa un semplice FixedThreadpool. C'è una ragione per questo? Scala forkjoins e può anche dire all'esecutore che sta bloccando il codice in modo da consigliare di generare più thread. (http://docs.scala-lang.org/overviews/core/futures.html) e (http://dev.clojure.org/display/design/Async+Executor) – ClojureMostly