2014-12-07 51 views
2

我有3個長時間運行的任務需要同步。它們是獨立的,但調用線程必須等到三個完成才能繼續。Clojure與期待同步

我可以爲每個任務創建一個代理並等待它們,但代理並不是真正的正確的語義結構,因爲每個代理只會被調用一次。

我真正想要的是等待3期貨,或者更接近我試圖實現的方法。

我可以等待期貨而不是代理嗎?

編輯:

我猜的答案僅僅是簡單地DEREF未來每調用線程在一個循環,這將阻塞,直到他們都回來了。如果我想在這段時間內做「準備」工作,我可以將「defrefing」代碼本身放在另一個未來。

回答

2

它看起來像你主要回答你自己的問題。我會添加我的2美分關於如何做到這一點。

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

這將做所有的期貨並行,然後在所有期貨完成後返回。如果您真的想在某處使用結果,您可以用(doall (for ...))代替doseq。或者,實際上,您可以跳過doall,然後只在實際訪問結果後才阻止。更進一步,您可以返回期貨本身的懶惰期,然後您可以通過deref訪問其中的任何一個,而與其他人的完成狀態無關。