2016-12-22 87 views
0

我有一個項目列表[1 2 3 4 5 ..]和一個函數進程(defn process[conn i] ..)Clojure中的並行處理

如何將此函數同時應用於列表的所有項目,但同時限制進程數量(例如,一次只能運行2個進程)。當所有進程完成時,我都會通知,以便我可以清理資源(關閉連接等)。

感謝,

回答

5

你可以只使用內置的Java執行者:

(defn process [conn i] 
    (println (str "Thread " (.getName (Thread/currentThread)) " executing " i "\n"))) 

(defn execute [data conn] 
    (let [svc (java.util.concurrent.Executors/newFixedThreadPool 2) 
     jobs (map (fn [v] #(process conn v)) data)] 
    (.invokeAll svc jobs))) 

(execute (range 100) nil) 

這裏execute將返回完成期貨的列表,每個作業的結果(這可能是要麼成功要麼失敗)。

+1

感謝亞歷克斯,我也發現這個有用的lib https://github.com/TheClimateCorporation/claypoole – QuanNH

+0

是的,這也是一個很好的。 –