首页 > 解决方案 > 有没有办法在并行执行时获取一组期货并将它们作为一个组阻止?

问题描述

我希望能够等待一组功能。我希望它们并行执行,但要阻塞直到最后一个未来完成。(我不希望它们按顺序执行,例如 with (do @(future-1) @(future-2))

就像是

(declare long-running-fn-1)
(declare long-running-fn-2)

(let [results (wait-for-all
   (long-running-fn-1 ...)
   (long-running-fn-2 ...)]

     (println "result 1" (first results)
     (println "result 2" (second results))

标签: clojurefuture

解决方案


sendFutures 被添加到定义它们时使用的同一线程池中。只要该池中有足够的空闲线程(其大小将略大于您可用的 CPU 内核数),计算就会立即开始。

问题(doall @(future ...) @(future ...))在于第二个是在第一个被取消引用之后future才创建的。

这是您的代码的略微修改版本,它在取消引用之前定义了两个期货(开始它们的计算);你会看到它只需要 5 秒而不是 10 秒:

(time
  (let [future-1 (future (Thread/sleep 5000))
        future-2 (future (Thread/sleep 5000))]
    [@future-1 @future-2]))

推荐阅读