2016-12-22 4 views
0

У меня есть список товаров [1 2 3 4 5 ..] и процесс функции на нем (defn process[conn i] ..).Параллельный процесс в Clojure

Как я могу применить эту функцию ко всему элементу списка одновременно, но одновременно ограничить количество процессов (например, одновременно запускается всего 2 процесса). И когда все процессы завершены, я уведомлялся о том, что могу очищать ресурсы (закрыть conn и т. Д.).

Спасибо,

ответ

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 будет возвращать список завершенных Futures с результатами каждого задания (которые могут быть либо успех или недостаточность).

+1

Спасибо Алекс, я также нашел этот полезный lib https://github.com/TheClimateCorporation/claypoole – QuanNH

+0

Да, это тоже хорошо. –

Смежные вопросы