我需要同步3个长时间运行的任务。它们是独立的,但调用线程必须等到所有三个都完成后再继续。
我可以为每个任务创建一个代理,并等待它们,但是代理并不是真正正确的语义结构,因为每个代理只会被调用一次。
我真正想要的是等待3个未来,或者某种方法更类似于我想要达到的目标。
我可以等待期货代替代理吗?
编辑:
我想答案只是简单地在循环中对调用线程中的每个未来进行deref,这将阻止它们全部返回。如果我想做"准备"在这段时间工作,我可以把'#34; defrefing"在另一个未来编码本身。
答案 0 :(得分:2)
看起来你大多回答了自己的问题。我会增加2美分关于如何做到这一点。
(defn many-futures
[tasks]
(let [futures (for [task tasks]
(future (task)))]
(do-prep tasks)
(doseq [completion futures]
@completion)))
这将与所有期货同时进行准备,然后在所有期货完成后返回。如果您确实想在某处使用结果,可以用(doall (for ...))
替换doseq。或者,实际上,您可以跳过doall
,然后只有在实际访问结果后才会阻止。更进一步,你可以返回lazy-seq的期货本身,然后你可以通过deref
访问其中任何一个,而不管其他人的完成状态。