Clojure中的并发过程

时间:2016-12-22 13:41:04

标签: concurrency clojure

我有一个项目[1 2 3 4 5 ..]列表及其上的功能流程(defn process[conn i] ..)

如何同时将此功能应用于列表的所有项目,但同时限制进程数量(例如,一次只运行2个进程)。当所有进程完成后,我被通知,以便我可以清理资源(关闭conn等)。

谢谢,

1 个答案:

答案 0 :(得分: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将返回已完成的期货清单以及每项工作的结果(可能成功或失败)。