concurrency - Clojure 中的死简单 Fork-Join 并发

标签 concurrency clojure future

我有两个独立的昂贵函数。我想并行运行它们。我不想处理 future 等(我是 Clojure 的新手,很容易混淆)。

我正在寻找一种同时运行两个函数的简单方法。我希望它像下面这样工作

(defn fn1 [input] ...) ; costly
(defn fn2 [input] ...) ; costly

(let [[out1 out2] (conc (fn1 x) (fn2 y))] ...)

我希望它返回一个带有一对输出的向量。它应该只在两个线程都终止后返回。理想情况下, conc 应该适用于任意数量的输入。我怀疑这是一个简单的模式。

最佳答案

在 Clojure 中使用 future 非常容易。无论如何,这是一个避免它们的答案

(defn conc [& fns]
  (doall (pmap (fn [f] (f)) fns)))
pmap在幕后使用 future 。 doall将强制序列进行评估。
(let [[out1 out2] (conc fn1 fn2)]
        [out1 out2])

请注意,我解构了 out1out2试图保留您的示例。

关于concurrency - Clojure 中的死简单 Fork-Join 并发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12415316/

相关文章:

c# - 断开连接的 LINQ 使用触发器更新 : rowversion vs. 日期时间?

java - 并发变量修改 : cannot fully understand this example

clojure - 如何通过逆时针(或 la clojure)运行/调试 compojure Web 应用程序

clojure - 为什么不能在 Clojure REPL 中更改 clojure.repl/print-doc 绑定(bind)?

flutter - Flutter/Dart Scope问题-是否需要返回信息以防止重复文件上传?

c++ - boost::future .then() 继续返回 boost::future

c++ - 使用 std::future/std::async

http - 如何在 Swift 3 中同时发出 https 请求

java - 基本 Java 线程(4 个线程)比非线程慢

clojure - 环防伪中间件是否可以有条件应用?