是否有一个Clojure成语用于并行调度多个表达式

Sea*_*rth 5 concurrency clojure

我有一些(未评估的)表达式保存在向量中; [expr1 expr2 expr3 ...]

我想做的是将每个表达式交给一个单独的线程,并等待一个返回一个值.此时我对其他线程的结果不感兴趣,并希望取消它们以节省CPU资源.

(我意识到这可能导致非确定性,因为程序的不同运行可能会导致首先评估不同的表达式.我手头有这个.)

是否有实现上述目标的标准/惯用方法?

sou*_*eck 5

这是我的看法.

基本上,您必须在每个期货内部解决全局承诺,然后返回包含未来清单和已解决价值的向量,然后取消列表中的所有期货:

(defn run-and-cancel [& expr]
    (let [p (promise)
          run-futures (fn [& expr] [(doall (map #(future (deliver p (eval %1))) expr)) @p])
          [fs res] (apply run-futures expr)]
        (map future-cancel fs)
        res))
Run Code Online (Sandbox Code Playgroud)