ThreadPool in Clojure

Clojure supports flexible concurrency models for real world complexity:

  • STM: built-in support.
  • CSP: similar to Golang concurrency model, with help of core.async library.
  • Actor: using Pulsar library, similar to Erlang Actor & Akka in Scala.

Sometimes, we just want to run some simple tasks in parallel & control its level of parallelism. It could be done using the built-in Java executors:

(import '(java.util.concurrent Executors))

(defn process [i]
  (str "Thread " (.getName (Thread/currentThread)) " executing " i))

(defn execute [data]
  (let [pool (Executors/newFixedThreadPool 2)
        tasks (map (fn [v] #(process v)) data)]
    (doseq [future (.invokeAll pool tasks)]
      (println (.get future)))
    (.shutdown pool)))

(execute (range 100))

Using climate/claypoole library

(require '[com.climate.claypoole :as cp])

;; Use a temporary threadpool with 4 threads.
(cp/pmap 4 myfunction myinput)
;; Use a temporary threadpool with ncpus + 2 threads.
(cp/pmap (+ 2 (cp/ncpus)) myfunction myinput)

notes

Bình luận


White
{{ comment.user.name }}
Bỏ hay Hay
{{comment.like_count}}
Male avatar
{{ comment_error }}
Hủy
   

Hiển thị thử

Chỉnh sửa

White

Quan

5 bài viết.
2 người follow
Kipalog
{{userFollowed ? 'Following' : 'Follow'}}
Bài viết liên quan
White
0 0
Clojure là ngôn ngữ functional có hỗ trợ OOP. Về mặt khoa học máy tính, có nhiều cách để thực hiện đa hình. Ở phiên bản trước 1.2, đa hình trong Cl...
Ngoc Dao viết hơn 3 năm trước
0 0
White
2 0
Cách mã nguồn mở hoạt động vẫn là bí ẩn đối với nhiều người. Hi vọng bài viết nhằm gây quỹ cho Clojure dưới đây sẽ giúp giải tỏa thắc mắc cốt lõi c...
Ngoc Dao viết hơn 3 năm trước
2 0
{{like_count}}

kipalog

{{ comment_count }}

bình luận

{{liked ? "Đã kipalog" : "Kipalog"}}


White
{{userFollowed ? 'Following' : 'Follow'}}
5 bài viết.
2 người follow

 Đầu mục bài viết

Vẫn còn nữa! x

Kipalog vẫn còn rất nhiều bài viết hay và chủ đề thú vị chờ bạn khám phá!