में धागा बनाम http://martintrojer.github.io/clojure/2013/07/07/coreasync-and-blocking-io/ से:जाने ब्लॉक core.async
में थोड़ा और अधिक ठोस है जब हम core.async का उपयोग कर कुछ HTTP GET अनुरोध जारी करने के लिए कोशिश देखते हैं क्या होता है प्राप्त करने के लिए। आइए क्लोज-एचटीएमएल के माध्यम से ब्लॉकिंग आईओ का उपयोग करके बेवकूफ समाधान से शुरू करें।
(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 )))
यहाँ हम 90 कोड के टुकड़े को लाने (समानांतर में) ब्लॉक जाना का उपयोग कर कोशिश कर रहे हैं (और आईओ अवरुद्ध)। इसमें काफी समय लगा, और ऐसा इसलिए है क्योंकि गो ब्लॉक थ्रेड लंबे समय तक चल रहे आईओ ऑपरेशंस द्वारा "छेड़छाड़" किए जाते हैं। गो ब्लॉक को सामान्य धागे पर स्विच करके स्थिति में सुधार किया जा सकता है।
(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 )))
इसका क्या मतलब है "जाना ब्लॉक धागे लंबे चल आईओ आपरेशन द्वारा hogged कर रहे हैं" है?
हालांकि मैं क्लोजर फोर्कजोइन का भी उपयोग करता हूं लेकिन ऐसा लगता है कि ऐसा नहीं है। यह एक साधारण फिक्स्ड थ्रेडपूल का उपयोग करता है। क्या इसका कोई कारण है? स्कैला फोर्कज सिक्के और निष्पादक को यह भी बता सकते हैं कि यह कोड अवरुद्ध कर रहा है ताकि अधिक धागे को बढ़ाने की सलाह दी जा सके। (http://docs.scala-lang.org/overviews/core/futures.html) और (http://dev.clojure.org/display/design/Async+Executor) – ClojureMostly