2011-07-21 22 views
3

假設我有一個ref狀態,每30秒更新一次,我想附加一個fn,可能需要更長時間才能完成。假設在時間0 ref被更新並且在時間fn被調用30 ref被再次更新,但是fn仍在運行。我是否獲得了同一個函數的兩個副本運行,或者是否只是在時間60跳過並執行,假設fn在那時返回?Clojure refs和add-watch

編輯:我想改變裁判的狀態。它在其他地方更新,我只是試圖用它作爲觸發器來做一些控制計算。

回答

1

如果您使用ref,那麼兩個函數將平行運行,並爭奪產生ref的下一個狀態的權利,同時失敗者必須再次運行。

這是refs和代理之間的區別之一。代理按順序運行,因爲它們有一個等待運行的函數隊列。

+1

fn不會更改參考。它實際上是基於ref做一些計算。它所做的是基於它控制一堆角色的世界狀態。我不想要的是兩個函數試圖修改字符。 –

+0

使用ref(如第一點),你很可能不會得到你正在尋找的結果。向代理添加手錶應該更接近你想要的。 –

+0

如果您必須使用ref,您可以添加一個監視器,將更新函數發送給代理。這樣你的更新功能將不會被稱爲額外的時間。 –