【问题标题】:Clojure Synchronize Futures with AwaitClojure 将 Future 与 Await 同步
【发布时间】:2014-12-08 05:36:33
【问题描述】:

我有 3 个长时间运行的任务需要同步。它们是独立的,但调用线程必须等到三个都完成后才能继续。

我可以为每个任务创建一个代理,然后等待它们,但代理并不是真正正确的语义构造,因为每个代理只会被调用一次。

我真正想要的是等待 3 个未来,或者一些更接近我想要实现的方法。

我可以等待期货而不是代理吗?

编辑:

我想答案只是简单地在一个循环中取消调用调用线程中的每个未来,这将阻塞直到它们全部返回。如果我想在这段时间做“准备”工作,我可以将“defrefing”代码本身放在另一个未来。

【问题讨论】:

    标签: clojure future async-await


    【解决方案1】:

    看起来您主要回答了自己的问题。不过,我会加 2 美分来说明如何做到这一点。

    (defn many-futures
       [tasks]
      (let [futures (for [task tasks]
                      (future (task)))]
        (do-prep tasks)
        (doseq [completion futures]
          @completion)))
    

    这将与所有期货并行进行准备,然后在所有期货完成后返回。如果你真的想在某处使用结果,你可以用(doall (for ...)) 替换doseq。或者,实际上,您可以跳过doall,然后仅在实际访问结果时才阻塞。更进一步,您可以返回期货本身的惰性序列,然后您可以通过deref 访问其中任何一个,而与其他期货的完成状态无关。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-04-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-22
      • 2020-06-27
      相关资源
      最近更新 更多