如何在Clojure中使用所有CPU内核

Zur*_*iar 3 concurrency multithreading clojure

我有以下代码:

(defn compile-report [id]
    (let [a (gen-first-part id)
          b (gen-second-part id)
          c (gen-third-part id)
          d (gen-fourth-part id)]

    (conj a b c d)))
Run Code Online (Sandbox Code Playgroud)

每个'gen-x-part'函数都是cpu密集型的.据我了解,let表单将在单个线程上串行运行这些计算.如果我有一个核心机器,那么在它自己的线程上运行它们就没有意义,因为它们都是cpu绑定的.但是,我有一台4芯机器.如何利用每个核心并将这些功能分配到自己的核心?谢谢.

Pio*_*dyl 10

您可以将CPU密集型函数包装成futures:

(defn compile-report [id]
  (let [a (future (gen-first-part id))
        b (future (gen-second-part id))
        c (future (gen-third-part id))
        d (future (gen-fourth-part id))]

    (conj @a @b @c @d)))
Run Code Online (Sandbox Code Playgroud)

它将使它们在单独的线程中运行.@a意味着(deref a)将阻止直到结果可用.

如果您的函数处理更大的Clojure数据集,您也可以查看pmap.

  • @ user3231690对这两个问题都是肯定的. (3认同)